代码之家  ›  专栏  ›  技术社区  ›  adriaanp

视图和演示者应在何处出生

  •  5
  • adriaanp  · 技术社区  · 17 年前

    我现在完全理解mvp模式,但是我仍然很难看到视图和演示者在哪里被实例化。我看过一些例子,演示者在视图中是新出现的,但这是正确的吗?在阅读了jeremy miller关于view和presenter之间通信的博客文章之后,他在presenter上有一个功能,可以将presenter附加到view上。

    我的问题是:应该在哪里创建视图和演示者?在winforms和webforms中也是如此。

    3 回复  |  直到 13 年前
        1
  •  3
  •   Matt Briggs    17 年前

    在webforms中,页面由请求实例化。由于页面是视图,您无法控制执行顺序,因此必须向演示者注册自己的视图。

        2
  •  2
  •   Dan Vinton    17 年前

    在winforms中,我根据需要实例化视图(例如 main 方法,或者在另一个演示者的方法中,但是只要有真正意义的地方)。然后,视图将创建自己并将其注册到演示者的新实例中。

    这使得有多个视图使用同一个Presenter逻辑变得容易,并使我的视图的用户免受使用MVP的特定体系结构决定的影响。

        3
  •  1
  •   Community Mohan Dere    9 年前

    第一个好问题。第二,这可能无关紧要。我个人的偏好是几乎总是把演示者和视图连接起来。

    比较此方案:

    public class SomePresenter
    {
        public ShowContactView(IContactView view)
        {
            IContact model = new Contact();
            new ContactPresenter(model, view);
            view.Show();
        }
    } 
    
    public class AnotherPresenter
    {
        public ShowContactView(IContactView view)
        {
            IContact model = new Contact();
            new ContactPresenter(model, view);
            view.Show();
        }
    } 
    
    public class YetAnotherPresenter
    {
        public ShowContactView(IContactView view)
        {
            IContact model = new Contact();
            new ContactPresenter(model, view);
            view.Show();
        }
    } 
    
    public partial class ContactView : Form, IContactView
    {    
        public ContactView()
        {
            InitializeComponent();
        }
    }
    

    对此:

    public class SomePresenter
    {
        public ShowContactView(IContactView view)
        {
            view.Show();
        }
    } 
    
    public class AnotherPresenter
    {
        public ShowContactView(IContactView view)
        {
            view.Show();
        }
    } 
    
    public class YetAnotherPresenter
    {
        public ShowContactView(IContactView view)
        {
            view.Show();
        }
    } 
    
    public partial class ContactView : Form, IContactView
    {    
        public ContactView()
        {
            InitializeComponent();
    
            new ContactPresenter(new Contact(), this);
        }
    }
    

    如您所见,后者的代码重复性要小得多。当然,这是愚蠢的重复,或者你可以说你可以将公共功能转移到共享功能,但是你明白了,这只是一个例子。这时,您将在应用程序的多个部分实例化同一视图。

    此外,视图知道演示者的好处是,您只需要在视图项目中引用演示者,因此可以在不同的ui应用程序中重用同一演示者。否则,您将需要引用演示者中的每个视图项目。

    但更重要的是看不同的型号如何适合你的情况。 说实话, there are more possibilities even. See this duplicate question.