MVP模式:模型如何要求视图?

时间:2015-08-25 14:00:25

标签: c# winforms design-patterns mvp

我在实施MVP模式时遇到了麻烦。解释一下:

我有一个实现接口的WinForm( View )(其对应的 IView )。 我还有演示者,最后还有模型

但在开始时,没有IView,也没有Presenter和Model。有一个巨大的视图创造了一切。所以重构开始......

一切都很顺利,几近完美。但是现在,我遇到了这种情况,有一个关于设计的问题来找我:

我发现视图有一个接管事件的方法。这个方法非常大,有很多逻辑。所以我只是将所有方法放在演示者中以释放逻辑视图。一切都很好。

但是,然后,我想从这个逻辑中释放演示者并用它来充电模型...因为那个逻辑是业务规则!

我开始这样做,然后我意识到了一些事情:在某些地方,这个逻辑要求我实例化其他WinForms。

现在问题是: 如果演示者对业务规则一无所知,他不应该知道何时实例化WinForm。谁知道呢?当然是模型。但...

  1. 模型如何告诉某人哪个视图(以及何时) 实例?
  2. 谁应该是这个"某人"?
  3. 我说的时候我没事 主持人不应该知道何时以及创建哪个视图?只有当有人要求它(可能是模型)时才告诉IView实现这样做。
  4. 谢谢大家!

2 个答案:

答案 0 :(得分:1)

1)我看到了两种方法:

  • 在模型上声明事件,让视图(或演示者)订阅事件,当模型上的逻辑决定需要启动视图时,模型只触发事件,视图调用新视图
  • 使用代表。从视图中调用模型时,只需传递具有代码的代理来初始化它可能需要的视图,当模型上的逻辑决定需要启动视图时,模型只调用代理

2)演示者

3)如果视图的显示依赖于业务逻辑,那么演示者不应该做出决定

答案 1 :(得分:1)

  

模型如何告诉某人哪个View(以及何时)实例化?

这不是模特的工作。明确责任。这是应用程序逻辑。

  

谁应该是这个"某人"?

查看Application Controller and Event Aggregator pattern

  

当我说主持人不应该知道创建的时间和视图时,我还好吗?只有当有人要求它(可能是模型)时,才告诉IView实现这样做。

演示者只应通过其界面了解视图。有时您可能需要执行特定于WinForms的操作,但这仍然应该以某种方式进行抽象。演示者应该完全可以进行单元测试,如果他们开始了解具体细节,那就无法实现。