MVP Flow问题

时间:2010-12-02 13:50:26

标签: winforms inversion-of-control mvp

我正在使用Windows Form实现MVP模式,我对当前实现有疑问,因为我试图将其融入更复杂的架构中。 现在我有一个带有属性的完全不可知视图,一个在构造函数中注入视图的演示者和一个具有演示者实例的视图。这是代码: 查看

public class MyView : IMyView
{
   public MyView()
   {
      var presenter = new MyPresenter(this);
      presenter.Init();
   }
}

这是演示者

public class MyPresenter
{
   private IMyView view;
   private MyModel model;
   //
   public MyPresenter(IMyView view)
   {
      // injection
      this.view = view;
   }
}

通过这种方式,我可以完成两项任务:

  • 从“视图”
  • 调用Presenter上的方法
  • 与Presenter中的视图进行互动 现在,我有两个问题:
  • 要编排我使用IoC容器的所有内容,以便我可以轻松编写如下代码:

    var view = ioc.Resolve<IMyView>();
    var presenter = ioc.Resolve<MyPresenter>(); //view injected
    NavigationService.Show(presenter.View);
    

    到目前为止一切顺利。

  • 第一个问题:如何在作业完成后从Presenter取回模型? View使用的演示者与我在IoC容器中使用的演示者不同,因为View本身实例化了一个新的Presenter ...因此,Presenter公开的模型与在View中实例化的Presenter使用的模型不同

  • 第二个问题:当我拥有一个现有模型时,如何将现有模型传递给此MVP三元组?例如,如何使此代码适用于模拟来自存储库的详细信息视图

2 个答案:

答案 0 :(得分:3)

要采用更干净的方法,也要将模型注入演示者

public class MyPresenter
{
   private IMyView view;
   private MyModel model;

   public MyPresenter(IMyView view, MyModel model)
   {
      this.view = view;
      this.model = model
   }
}

通过这样做,您始终可以在创建它的演示者之外引用模型。

当您这样做时,您始终可以选择要使用的型号。 例如,如果您的后端(您的模型)没有完成,您可以编写模拟模型(当您使用模型的界面时)来测试演示者和您的视图。

希望这有帮助

答案 1 :(得分:0)

基于此,我将通过反转依赖关系来改变一切。 视图现在不会创建演示者的实例,但它会通过以下方式由演示者本身注入一个:

public MyPresenter(IView myView, Model myModel)
{
   this.View = myView;
   this.View.Presenter = this;
   this.Model = myModel;
}

到目前为止,这么好。 现在在View端,Presenter作为Write Only属性公开,因此View不能更改它,但只能使用它:

public class MyView : IView
{
   public MyPresenter Presenter { get; private set; }
}

到目前为止一切顺利。 现在IoC会这样做:

var view = IoC.Resolve<IView>();
var model = repository.GetModel(); // or new Model();
var presenter = IoC.Resolve<MyPresenter>(); //view and model injected
presenter.ShowView();
var result = presenter.Model;

对我来说,它看起来不错,但我只是想确定我没有打破MVP逻辑。