我正在尝试使用Passive View在WinForm应用程序上学习并应用MVP。我已经浏览了网上的资料(有些不知所措),但找不到以简单的术语解释的主题。我想了解两件事:
演示者是否应该为了保持单一职责而呼叫其他演示者?还是自己处理所有相关的逻辑(模型)?
在没有将视图传递给演示者的情况下,任何演示者如何注册到任何View的事件?
假设两个实体:人和汽车。一个人可以拥有1辆或更多辆汽车。可能有简单的视图,例如SinglePersonView
和SingleCarView
,它们具有相应的演示者,例如PersonPresenter
和CarPresenter
。但是,可能会有一个视图显示任何人的汽车列表。此表单(例如PersonsCarsView
)将通过其演示者PersonsCarsPresenter
与Person和Car实体进行交易。假设用户选择一个人,并且列出了属于该人的汽车。如果用户双击汽车(在IPersonsCarsView
中定义为OnCarClick
的事件),则会打开一个新表单SingleCarView
。
现在,这就是我遇到的问题。更多信息:
视图不会传递给演示者的构造函数,而是演示者会将对该视图的引用作为私有变量保存。
演示者在构造函数中订阅其视图的事件
PersonsCarsPresenter
将如何处理(即显示单个汽车的详细信息,而CarPresenter
则应独自负责)?它是否还应该包含对SingleCarView
的引用?
我尝试过的事情:
为CarPresenter
添加另一个构造函数定义,该定义以PersonsCarsView
作为参数。然后,
PersonsCarsPresenter
实例化CarPresenter
,然后显示PersonsCarsView
并将此视图(PersonsCarsView
)传递给CarPresenter
,以便它可以订阅{{ 1}}事件由OnCarClick
实现。
通过这种方法,我认为我已经实现了单一职责,即PersonsCarsView
将处理显示汽车的信息,并且所有相关代码应在CarPresenter
中,而CarPresenter
应该对此一无所知什么视图或如何收集信息以显示单个汽车。但是与此同时,PersonsCarsPresenter
与CarPresenter
很难绑定,对我来说,这就是模型的样式,即人与汽车相连。
我不明白的是,PersonsCarsPresenter
不应将对CarPresenter
的引用作为变量保存,因为它应该知道这个特定视图可以< em>还打电话。但这将是类似于PersonsCarsView
的事物,它将是一种新形式,不是是Dim _PersonsCarsViewRef = New PersonsCarsView
在启动时打开的表单(现在传递给{{1 }}构造函数)。但是,将View传递给了主持人,这是我要避免使主持人与视图之间保持松散耦合的方式。