【问题标题】:MVP Pattern: How does the model ask for a View?MVP 模式:模型如何请求视图?
【发布时间】:2023-04-09 13:58:01
【问题描述】:

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

我有一个 WinForm(View),它实现了一个接口(它对应的IView)。 我还有一个 presenter,最后还有一个 model

但一开始,没有IView,也没有Presenter,也没有Model。有一个巨大的景观造就了一切。于是重构开始了……

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

我发现视图有一个接管事件的方法。这个方法很大,有很多逻辑。所以我只是把所有的方法放在presenter中,解放逻辑的视野。一切都很好。

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

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

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

  1. 模型如何告诉某人使用哪个视图(以及何时) 实例化?
  2. 这个“某人”应该是谁?
  3. 当我说我没事的时候 演示者不应该知道何时以及创建哪个视图?仅在有人要求(可能是模型)时才告诉 IView 实现这样做。

谢谢大家!

【问题讨论】:

  • 我不确定这是否有帮助,但我认为你的意思是 MVC,你有 MVP。如果是这样,那么通知模型的是控制器,并且是模型和视图之间的“粘合剂”。祝你的项目好运 :-) 以下是更多信息的链接:tomdalling.com/blog/software-design/…
  • 感谢 Jacob,但我实际上是指 MVP。据我了解,MVP 中的 Model 涉及到 Controller 和 MVC 的 Model。 MVP 仅通过 Presenter 将 View 与 Model 解耦。 (这就是为什么演示者不应该知道业务规则)。不过还是谢谢! ;)

标签: c# winforms design-patterns mvp


【解决方案1】:

1) 我看到了两种方法:

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

2) 演示者

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

【讨论】:

  • 声明事件并订阅它们看起来是个好主意。非常感谢,乔奥!
【解决方案2】:

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

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

这个“某人”应该是谁?

查看Application Controller and Event Aggregator pattern

当我说演示者不应该知道何时以及创建哪个视图时,我可以吗?仅在有人要求时才告诉 IView 实现执行此操作(可能是模型)。

演示者应该只通过其界面知道视图。有时您可能需要执行 WinForms-specifics,但这仍应以某种方式抽象。演示者应该是完全可单元测试的,如果他们开始了解具体细节,这将变得无法实现。

【讨论】:

  • 大卫,如果不是模特,那么这个责任是谁的?据我了解 MVP 模式,该模型涉及业务规则(逻辑)和数据模型。我们不是在谈论 MVC,而是在谈论 MVP。这对我来说很有意义。否则,MVP 模式将没有找到“应用程序逻辑”的层。
猜你喜欢
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2012-07-03
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多