【问题标题】:How not to create presenter object in view?如何不在视图中创建演示者对象?
【发布时间】:2009-11-09 14:09:24
【问题描述】:

我目前正在尝试一些 MVP 模式示例,有人告诉我不要在 View 中创建具体的 Presenter 对象。有没有办法让Presenter 动态创建对象?

public partial class View: Window, IView
{
   private Presenter _presenter;

    public View()
    {
        InitializeComponent();
        _presenter = new Presenter(this); //Asked to avoid this
    }
}

【问题讨论】:

    标签: c# design-patterns mvp


    【解决方案1】:

    你想错了。您不会在视图中创建演示者。您在其他地方(应用程序启动、其他演示者)创建它,然后它会将自身作为构造函数参数或通过设置属性传递给视图。

    像这样:

    class FooView : IFooView
    {
        private readonly IFooPresenter presenter;
    
        public FooView(IFooPresenter presenter)
        {
            this.presenter = presenter;
        }
    }
    
    class FooPresenter1 : IFooPresenter
    {
        private readonly IFooView view;
    
        public FooPresenter1()
        {
            view = new FooView(this);
        }
    }
    // or
    class FooPresenter2 : IFooPresenter
    {
        private readonly IFooView view;
    
        public FooPresenter2(IFooView view)
        {
            this.view = view;
            view.Presenter = this;
        }
    }
    

    顺便说一句,您似乎正在使用 WPF。如果是这种情况,您可能需要查看Model-View-ViewModel pattern

    【讨论】:

    • 这在网络表单中不起作用。 View 是第一个处理请求的,因此它必须创建一个演示者。
    • @epitka:我讨厌网络表单。不过,这仍然是一个有效的观点。我只是假设他在做一些桌面工作,因为他的 View 继承自 Window。
    【解决方案2】:

    通过先查看创建,您可以使用 IoC 容器来创建您的 Presenter:

    public View(IMyPresenter presenter)
    {
        InitializeComponent();
        _presenter = presenter;
    }
    

    或者,您可以先使用 model (presenter),其中 View 以几乎相同的方式传递给 Presenter。有关此主题的讨论,请参阅 Which came first, the View or the Model?

    或者您可以使用第三个对象将 View 和 Presenter 绑定在一起,例如 Caliburn 中的 IBinder service

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2017-11-07
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多