ASP.NET MVP模式

Fre*_*jck 3 c# asp.net mvp design-patterns

我正在尝试在我的应用程序中实现Model-View-Presenter设计模式.MVP模式的一般概念对我来说是已知的,但我更难以使用嵌套的用户控件来完成它.

我有一些可能的方案我可以实现,但在此之前,我想听听你的意见.

我认为发布我的任何代码并不重要,因为它更像是一个我试图理解的"概念".

所以场景是:

1页用于连接2个用户控件.其中一个用户控件包含一个子用户控件.在这种情况下,我如何解决MVP模式?

1 Page
  1 UC
  1 UC
     1 SubUC
Run Code Online (Sandbox Code Playgroud)

编辑:

基本上我想知道的是我们如何在两个用户控件中使用MVP在两个视图(父级和子级)之间进行交互.

我将在没有MVP的ASP.net中向您展示一个示例:http: //pastie.org/5452134

现在使用MVP,我们是否仍然使用CodeBehind注册此类事件?知道这个父和子用户控件都将使用MVP模式.或者演示者是否包含在此互动中?

最终我可以将代码更改为:http: //pastie.org/5452180

但考虑到MVP模式,我想知道这是否合适......

或者我们更需要这样的方法:http: //pastie.org/5452174

以上所有示例都是在父视图的CodeBehind中编写的.这是正确的吗?如果没有,我们如何使用更好的方法实现这一目标

编辑2:我已经在我的示例方法中添加了一个解决方案:https://github.com/frederikprijck/ASP.NET-MVP 我认为这应该是我想要的......

Vin*_*ayC 5

我没有看到问题 - 用户控制只是一个视图.演示者可以一次与多个视图进行交互.因此,在这种情况下,您的演示者可以引用4个视图(一个用于页面,两个用于用户控件,最后一个用于子用户控件).

或者,您希望每个演示者具有单个视图,在这种情况下,您可以将用户控件视为父视图(页面)的子视图,因此父视图需要为演示者提供向上和向下视图交互.但是,我更喜欢早期的方法,其中演示者处理交互多个视图.

请参阅有关如何完成接线的相关问题:https://softwareengineering.stackexchange.com/questions/60774/model-view-presenter-implementation-thoughts

最后,你可能想看看MVVM模式,我相信它对于组合UI很有用.您将拥有控制视图和模型之间交互的视图模型,而不是演示者 - 但是,与演示者不同,视图模型不了解视图 - 而是视图观察(和更新)视图模型以呈现自身.在这里查看这篇文章(View Model被称为Presentation Model):http: //www.codeproject.com/Articles/23340/Presentation-Model-in-Action

编辑:

说实话,我不喜欢你的任何方法.我喜欢MVP实现,其中presenter通过接口保持对视图的引用(没有紧耦合),并且视图执行连接,即创建presenter实例并注入视图引用.演示者侦听视图中的事件和调用方法.View永远不会直接调用presenter的方法.(MVP的其他变体是可能的 - 参见我所寻求的SO答案).有了这个,我将解释我之前解释过的两种方法.

方法1:

每个用户控件都是一个独立的视图.会有一个共同的演示者来处理多个视图.例如,

public class Presenter1
{
    IView1 _view1;
    IView2 _view2;

    public Presenter1(IView1 view1, IView2 view2)
    {
        _view1 = view1;
        _view2 = view2;

        _view1.OnSave += OnSave;
        _view1.OnSomeEvent += OnSomeEvent;
        _view2.OnFoo += OnFoo;
    }

    public void OnSave()
    {
        var data1 = _view1.GetData();
        var data2 = _view2.GetData();
        // update model
        ...
    }

    public void OnSomeEvent()
    {
       // inform view2 about it
       _view2.DoOnSomeEvent();
    }

    ...
}

public partial class MyPage : Page, IView1
{
   public void Page_Load(...)
   {
     //do wire up
     _presenter = new Presenter(this, usercontrol1);
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

基本的想法是视图不做交叉谈话.如果用户控件需要通知页面某些内容,则会引发由演示者捕获的事件,并将其通知页面.视图是被动的并处理UI.

方法2:

Usercontrol和Page交互.在这种情况下,Page将作为终极视图,Presenter将参考它.控件的事件将由页面处理,页面将在必要时冒泡事件.例如,

IView1 : IView2 { }

public class Presenter1
{
   IView1 _view1;

   public Presenter1(IView1 view1)
   {
       _view1 = view1;

       _view1.OnSave += OnSave;
       _view1.OnSomeEvent += OnSomeEvent;
       _view1.OnFoo += OnFoo;
   }
   ...
}

public partial class MyPage : Page, IView1
{
       public void Page_Load(...)
       {
         //do wire up
         _presenter = new Presenter(this);

         // handle user control events
         UserControl1.Foo += UserControl1_OnFoo();
         UserControl1.XyzEvent += UserControl1_XyzEvent();

       }
       ...

       private void UserControl1_OnFoo(...)
       {
          // bubble up to presenter
          OnFoo(..)
       }

       private void UserControl1_XyzEvent(...)
       {
          // private interaction (purely about some UI manipulation), 
          // will not be bubble up to presenter
          ...
       }
}
Run Code Online (Sandbox Code Playgroud)