gpt4 book ai didi

winforms - MVP模式中使用Windsor caSTLe进行依赖注入(inject)的循环引用问题

转载 作者:行者123 更新时间:2023-12-04 15:24:34 29 4
gpt4 key购买 nike

使用 Windsor 容器创建以下 MVP 设计(用于 winforms)时,我面临循环依赖问题。

我的演示者取决于 View 和模型:

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>());

解决 View 带来了循环引用问题:
container.Resolve<ConcreteView>(); //doesn't resolve because of cyclic dependency

一种可能的解决方案是从 View 中删除构造函数注入(inject)并单独解析演示者。
但这导致我在两个我不想做的地方使用容器,并且可能是错误的。
ConcreteView()
{
container.Resolve<ConcretePresenter>(); //resolving at 2 different points
}

有没有更好的解决方案。我在 MVP 本身做错了什么吗?

最佳答案

这个问题有几种解决方案,但它们都通过从构造函数依赖中删除演示者或 View 来打破依赖循环。

最简单的解决方案是将 View 作为演示者的属性引入:

// Presenter
ConcretePresenter(IModel model)
{
this.model = model;
}

public IView View { get; set; }

// View
ConcreteView(ConcretePresenter presenter)
{
this.presenter = presenter;
this.presenter.View = this;
}

这样做的缺点是您需要在将每个演示者注入(inject) View 时对其进行配置,因此您也可以将其移至基类:
// View
ConcreteView(ConcretePresenter presenter) : base(presenter)
{
}

BaseView(IPresenter presenter)
{
Contract.Requires(presenter != null);
presenter.View = this;
this.Presenter = presenter;
}

另一种选择是将演示者工厂注入(inject) View 并从那里请求它:
// View
ConcreteView(IPresenterFactory factory)
{
this.presenter = factory.CreatePresenterFor(this);
}

缺点是这个构造函数调用了一个工厂,这不是最干净的事情,但可以管理。

关于winforms - MVP模式中使用Windsor caSTLe进行依赖注入(inject)的循环引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13973238/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com