演示者如何在不将视图作为论点的情况下订阅其他视图的事件并承担单一责任?

时间:2019-02-04 17:12:23

标签: vb.net winforms mvp

我正在尝试使用Passive View在WinForm应用程序上学习并应用MVP。我已经浏览了网上的资料(有些不知所措),但找不到以简单的术语解释的主题。我想了解两件事:

  • 演示者是否应该为了保持单一职责而呼叫其他演示者?还是自己处理所有相关的逻辑(模型)?

  • 在没有将视图传递给演示者的情况下,任何演示者如何注册到任何View的事件?

假设两个实体:人和汽车。一个人可以拥有1辆或更多辆汽车。可能有简单的视图,例如SinglePersonViewSingleCarView,它们具有相应的演示者,例如PersonPresenterCarPresenter。但是,可能会有一个视图显示任何人的汽车列表。此表单(例如PersonsCarsView)将通过其演示者PersonsCarsPresenter与Person和Car实体进行交易。假设用户选择一个人,并且列出了属于该人的汽车。如果用户双击汽车(在IPersonsCarsView中定义为OnCarClick的事件),则会打开一个新表单SingleCarView

现在,这就是我遇到的问题。更多信息:

  • 视图不会传递给演示者的构造函数,而是演示者会将对该视图的引用作为私有变量保存。

  • 演示者在构造函数中订阅其视图的事件

PersonsCarsPresenter将如何处理(即显示单个汽车的详细信息,而CarPresenter则应独自负责)?它是否还应该包含对SingleCarView的引用?

我尝试过的事情:

  1. CarPresenter添加另一个构造函数定义,该定义以PersonsCarsView作为参数。然后,

  2. PersonsCarsPresenter实例化CarPresenter,然后显示PersonsCarsView并将此视图(PersonsCarsView)传递给CarPresenter,以便它可以订阅{{ 1}}事件由OnCarClick实现。

通过这种方法,我认为我已经实现了单一职责,即PersonsCarsView将处理显示汽车的信息,并且所有相关代码应在CarPresenter中,而CarPresenter应该对此一无所知什么视图或如何收集信息以显示单个汽车。但是与此同时,PersonsCarsPresenterCarPresenter很难绑定,对我来说,这就是模型的样式,即人与汽车相连。

我不明白的是,PersonsCarsPresenter不应将对CarPresenter的引用作为变量保存,因为它应该知道这个特定视图可以< em>还打电话。但这将是类似于PersonsCarsView的事物,它将是一种新形式,不是Dim _PersonsCarsViewRef = New PersonsCarsView在启动时打开的表单(现在传递给{{1 }}构造函数)。但是,将View传递给了主持人,这是我要避免使主持人与视图之间保持松散耦合的方式。

0 个答案:

没有答案