在MVC中,视图将事件发送到控制器,控制器将这些事件发送到模型。模型通过控制器向视图发送更改。
这引入了一个循环依赖,它使依赖注入(我通过构造函数手动注入依赖关系 - 不使用框架)不可能(导致单元测试代码更难)。我读了potential solution,但无法弄清楚如何应用它。
有人能指出我的解决方案吗?
提前致谢。
答案 0 :(得分:2)
另一个解决方案是让您的IoC容器为您创建工厂并注入这些工具,使用示例MVP实现来查看此类似问题。 Concrete视图需要Presenter,但Presenter需要IView(抽象)。它更像是循环引用而不是依赖。
public interface IView
{
string Name { get; set; }
}
public interface IPresenterFactory<TController>
{
TController Create<TView>(TView view);
}
public class ConcreteView : IView
{
private Presenter _Presenter;
public ConcreteView(IPresenterFactory<Presenter> presenter)
{
this._Presenter = presenter.Create(this);
}
}
public class Presenter
{
public Presenter(IView view)
{
this._View = view;
}
}
演示者工厂可以轻松地使用和包装您的IoC容器,然后根据需要生成工厂。单元测试也很简单,因为你可以很容易地创建一个模拟IPresenterFactory并构建你需要的Presenter或Controller。
答案 1 :(得分:1)
您自己找到的一种解决方案,但您可能还没有注意到:
在MVC中,视图将事件发送到控制器和控制器 将这些事件发送到模型。模型将更改发送到视图 通过控制器。
View和Model可以发布事件(想想观察者模式)来通知Controller,这意味着你既不在模型中也不在视图中对Controller有依赖。