MVP三合会之间的沟通

kse*_*een 6 .net c# mvp design-patterns winforms

好的,伙计们,比如我有这个表格,我在DockPanel中只有一个DockContent之前告诉过你

自那时起我编写的一个编辑是当用户点击左窗格中的某个项目时每个项目中的单词.我轻松地为左窗格创建了一个三元组.

它有项目主持人,项目视图,项目模型.这是每个东西的接口:

interface IProjectsModel
{
    void AttachPresenter(IProjectsModelObserver observer);
    System.Collections.Generic.List<Project> projects { get; }
    Project selectedProject { get; set; }
}

public interface IProjectsViewObserver
{
    void UserChangedSelectedProject(Project project);
}
public interface IProjectsModelObserver
{
    void SelectedProjectChanged(Project project);
}

public interface IProjectsView : IView
{
    List<Project> projects { set; }
    Project project { set; }

    void AttachPresenter(IProjectsViewObserver presenter);
}
Run Code Online (Sandbox Code Playgroud)

所以目前我正在考虑为右窗格创建一个全新的另一个MVP三元组.但这不是主要问题.我跑的主要问题是如何在上面告诉你的MVP三元组之间建立沟通过程?

我在网上看过一些文章,告诉我们在这种情况下有必要为项目引入一些模型协调员吗?

所以我的问题是:

  1. 我是否正确地做了两个三元组只有一个?
  2. 如何在彼此之间协调两个三元组?
  3. 任何建议/建议/提议/建议/提示任何你认为对我有用的许多其他东西将非常感谢!

非常感谢,伙计们!感谢您的关注和时间!

Gar*_*all 2

为了在演示者之间进行协调,您可以让您的MainForm班级实现IProjectsViewObserver并在用户选择不同项目时在右侧停靠窗格上设置文本。例如:

class MainForm : IProjectsViewObserver
{
    void UserChangedSelectedProject(Project project)
    {
          rightDockPane.setText(project.getText());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想测试这个行为,你可以创建一个单独的类:

class DockPaneProjectUpdater : IProjectsViewObserver
Run Code Online (Sandbox Code Playgroud)

尽管在本例中这是不必要的,因为代码非常简单。

您可以使用匿名方法研究更简单的方法来执行此操作,但我不知道足够的 C# 来帮助您。

我做两个三和弦而不是只做一个对吗?

是的,因为扩展坞和窗格是独立的组件,所以它们可能需要单独的 MVP 三元组。您可以通过尝试使代码可重用和可测试来决定 MVP 三元组的粒度(小)。

如何协调两个三元组之间的关系?

创建一个窗口级演示器,连接子演示器并可以协调三元组之间的行为。您可以让窗口演示者成为 aIProjectsViewObserver并根据 执行操作DockContent。或者,如果您确实想要模块化/单元测试行为,您可以创建一个单独的演示者类(通常是匿名类)用于三元组间通信。

任何您认为对我有用的提议/建议/优惠/建议/提示任何许多其他的东西都将非常感激!

阅读维基百科和有关 MVP 和演示者优先的在线文章。MVP 的最大好处是可测试性和行为(演示者)模块化,因此请确保通过单元测试(通常使用模拟/DI 框架)来利用它们,并在可以重用代码时将行为重构为 MVP 三元组。

弄清楚如何有效地应用 MVP 模式需要一些时间,所以要有耐心!