您的问题是 View 和 Presenter 之间存在依赖循环,因为它们相互依赖。打破这种依赖循环的一般规则是回退到属性注入,这也适用于您的情况。
使用 MVP,最好是让 View 通过将其注入到 Presenter 的属性中来将自己分配给创建的 Presenter:
mPresenter = container.Resolve<Presenter>();
mPresenter.View = this;
如果可以,请从应用程序中隐藏容器。由于您使用的是 MVP,因此您唯一需要直接解决的就是演示者。因此,与其让 Forms 与 Container 通信,不如让它们与 static 通信PresenterFactory
。这家工厂将使用盖子下的容器:
mPresenter = PresenterFactory.Create<MyPresenter>();
mPresenter.View = this;
你PresenterFactory
可能看起来像这样:
public static class PresenterFactory
{
private static IContainer container;
public static TPresenter Create<TPresenter>()
where TPresenter : IPresenter
{
return (TPresenter)
container.Resolve(typeof(TPresenter));
}
public static void SetContainer(IContainer container)
{
PresenterFactory.container = container;
}
}
您的 Composition Root 可能如下所示:
static void Main()
{
Bootstrap();
}
private static void Bootstrap()
{
var builder = new ContainerBuilder();
// TODO: register presenters
var container = builder.Build();
PresenterFactory.SetContainer(container);
}
更新
也许做这样的事情会更好:
interface IPresenter<TView>
{
TView View { get; set; }
}
public static class PresenterFactory
{
private static IContainer container;
public static IPresenter<TView> CreateForView<TView>(TView view)
{
var presenter = container.Resolve<IPresenter<TView>>();
presenter.View = view;
return presenter;
}
}
// View
mPresenter = PresenterFactory.CreateForView(this);
这从视图中隐藏了演示者的实际实现,并将视图的注册集中到演示者。