【问题标题】:MVP spawning MVP of subcomponentMVP 生成子组件的 MVP
【发布时间】:2013-07-08 05:35:43
【问题描述】:

我有一个很大的组件。我们也可以假设它是主要组件。这个组件应该包含一个子组件,在我的例子中它是一个抽象面板,并且它已经实现了自己的 MVP。现在我正在实现 MainComponent,因此我需要生成小型可重用抽象子组件的 MVP。

我现在的问题是: 我应该在哪里生成 3 个子部分中的每一个? 视图中的视图和模型中的演示者+模型? 视图中的视图、演示者中的演示者、模型中的模型?

提前感谢您对此的意见!

【问题讨论】:

  • “我有一个很大的组件。” - 那是因为你的名字是雷神!

标签: instantiation mvp


【解决方案1】:

您没有提供有关 MVP 的具体实现的太多细节,但以下是我对这个主题的看法:

它已经实现了自己的 MVP

我假设这意味着当加载视图时(无论是主视图还是子视图),它已经与正确的演示者和模型连接起来。我还假设如果任何子演示者与主演示者共享组件或服务,这些都由依赖注入框架解决。

如果我的假设不正确,则应更新负责加载视图的组件以确保发生这种情况,即当加载视图时它可以正常工作。

我现在的问题是:我应该在哪里生成 3 个子部分中的每一个?看法 模型中的视图和演示者+模型?在视图中查看,演示者在 主持人,模特中的模特?

根据我上面的评论,您应该有一个对象负责加载视图并确保它们被正确配置(让我们将此对象称为ViewLoader)。该对象只能直接从您的视图层调用,即从不从演示者调用。

但问题在于演示者对象驱动应用程序,因此需要一种告诉视图层加载另一个视图的方法。您可以通过将视图引用传递给演示者来解决此问题。视图引用应隐藏在不公开所使用视图技术的任何详细信息的界面后面,例如:

public interface IMainView
{
    void OpenSettings();
}

然后您的演示者可以调用OpenSettings() 方法。该方法将由具体的视图类实现,可能如下所示:

public class MainView : UserControl, IMainView
{
    public void OpenSettings()
    {
        var settingsView = viewLoader.Load(typeof(settingsView));
        this.tabControl.add(settingsView);
    }
}

请注意,实现接口的实际具体视图可以使用ViewLoader 加载视图,因此它只需要关注将视图插入视图层次结构(因为ViewLoader 提供了完全配置的视图) .

还要注意IMainView 接口描述的是应用程序行为,而不是实际的实现(即,它被命名为OpenSettings 而不是OpenDialog)。这意味着如果视图改变了它打开设置视图的方式(例如在对话框中显示它),那么只需要更新视图;演示者根本不需要更改,因为它仍然会调用 OpenSettings() 方法来调用所需的行为。

总结:

  • 演示者调用视图上的方法来驱动行为。
  • 视图隐藏在界面后面以隐藏视图技术的详细信息。
  • 视图加载器负责加载视图并将它们连接到模型和演示器。
  • 视图要求视图加载器加载所需的视图,并负责显示返回的、完全配置好的视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多