使用 Windsor 容器创建以下 MVP 设计(用于 winforms)时,我面临循环依赖问题。
我的演示者取决于视图和模型:
ConcretePresenter(IView view, IModel model)
{
this.view = view;
this.model = model;
}
我的观点取决于主持人:
ConcreteView(ConcretePresenter presenter)
{
//actual requirement that the presenter use the current instance of the view and a model object
//new presenter(this, new model())
this.presenter = presenter;
}
我正在使用温莎城堡(在单独的组合根类中)注册所有组件,如下所示:
IWindsorContainer container;
container = new WindsorContainer();
container.Register(Component.For<ConcretePresenter>().ImplementedBy<ConcretePresenter>());
container.Register(Component.For<IModel>().ImplementedBy<ConcreteModel>());
container.Register(Component.For<IView>().ImplementedBy<ConcreteView>());
解决视图带来了循环引用问题:
container.Resolve<ConcreteView>(); //doesn't resolve because of cyclic dependency
一种可能的解决方案是从视图中删除构造函数注入并单独解析演示者。 但这导致我在两个我不想做的地方使用容器,并且可能是错误的。
ConcreteView()
{
container.Resolve<ConcretePresenter>(); //resolving at 2 different points
}
有没有更好的解决方案。我在 MVP 本身做错了什么吗?