模型的Unity依赖注入

时间:2015-01-22 16:12:33

标签: c# asp.net-mvc dependency-injection unity-container

我刚刚开始在MVC中使用Unity,而且我遇到了一些代码重复。请考虑以下控制器/模型模式:

控制器:

public class MyController : Controller {
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;
    private readonly IDependency3 _dependency3;

    public MyController(
        IDependency1 dependency1,
        IDependency2 dependency2,
        IDependency3 dependency3
    ) {

    }

    public ActionResult Thingy() {
        var model = new Thingy(_dependency1, _dependency2, _dependency3);
        model.DoLogic();
        model.SetUpView();
        model.Finalize();
        return View(model);
    }
}

型号:

public class Thingy {
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;
    private readonly IDependency3 _dependency3;

    public Thingy(
        IDependency1 dependency1,
        IDependency2 dependency2,
        IDependency3 dependency3
    ) {

    }

    // Now I can use my dependencies
}

这允许我实现瘦的控制器/胖模型,但是现在我在Controller&amp ;;中复制依赖关系。模型。

我看到我可以在我的模型中使用属性:

public class Thingy {
    [Dependency]
    public IDependency1 Dependency1 { private get; set; };
    [Dependency]
    public IDependency2 Dependency2 { private get; set; };
    [Dependency]
    public IDependency3 Dependency3 { private get; set; };
}

然后在我的动作中初始化我的模型:

public ActionResult Thingy() {
    // No need to pass in via constructor
    var model = DependencyResolver.Current.GetService<Thingy>();
}

尼斯&amp;从编码POV倾斜,但我读到这是一个反模式?

问:为什么这被认为是反模式,我可以修改我的结构以防止代码重复吗?

1 个答案:

答案 0 :(得分:2)

是的,这是反模式。一个原因 - 过多的相关性代码。如果要替换IoC容器(例如NInject),则必须更改控制器和模型的代码。它违反了开放/封闭原则(http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))。此外,您将很难做单元测试控制器。