MVC循环和依赖注入

时间:2012-07-20 07:10:40

标签: model-view-controller dependency-injection

MVC中,视图将事件发送到控制器,控制器将这些事件发送到模型。模型通过控制器向视图发送更改。

这引入了一个循环依赖,它使依赖注入(我通过构造函数手动注入依赖关系 - 不使用框架)不可能(导致单元测试代码更难)。我读了potential solution,但无法弄清楚如何应用它。

有人能指出我的解决方案吗?

提前致谢。

2 个答案:

答案 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有依赖。