我正在使用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;
}
}
通过这种方式,我可以完成两项任务:
要编排我使用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三元组?例如,如何使此代码适用于模拟来自存储库的详细信息视图?
答案 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逻辑。