我正在尝试一些MVP模式样本,并且我被告知不要在Presenter
中创建具体的View
对象。有没有办法动态创建Presenter
个对象?
public partial class View: Window, IView
{
private Presenter _presenter;
public View()
{
InitializeComponent();
_presenter = new Presenter(this); //Asked to avoid this
}
}
答案 0 :(得分:2)
你认为这是错的。您不在视图中创建演示者。您可以在其他位置创建它(应用程序启动,其他演示者),并将其自身传递给视图,作为构造函数参数或通过设置属性。
像这样:
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。
答案 1 :(得分:2)
使用查看第一个创建,您可以使用IoC容器创建Presenter:
public View(IMyPresenter presenter)
{
InitializeComponent();
_presenter = presenter;
}
或者,您可以先使用模型(演示者),其中View以相同的方式传递给Presenter。有关此主题的讨论,请参阅Which came first, the View or the Model?。
或者您可以使用第三个对象将View和Presenter绑定在一起,例如Caliburn中的IBinder
service。