Ninject:用于注入多个依赖项的注入模式?

时间:2012-09-17 19:30:34

标签: dependency-injection ninject

如果我有10个依赖项,我需要注入,并且不希望在构造函数中有10个参数,我应该使用哪种注入模式?

public class SomeClass
{
    private IDependency1 _dependency1;
    private IDependency2 _dependency2;
    private IDependency3 _dependency3;
    //...
}

我应该使用setter方法注入吗?

public class SomeClass
{
    private IDependency1 _dependency1;
    private IDependency2 _dependency2;
    private IDependency3 _dependency3;
    //...

    [Inject]
    public void SetDependency1(IDependency1 dependency1)
    {
        _dependency1 = dependency1;
    }
    //...
}

或财产注入?

public class SomeClass
{
    [Inject]
    public IDependency1 Dependency1 { private get; set; }
    [Inject]
    public IDependency2 Dependency2 { private get; set; }
    [Inject]
    public IDependency3 Dependency3 { private get; set; }
    //...
}

根据Ninject wiki,只写上面的属性被认为是不好的做法,但是它与上面的setter方法注入不一样,只是少了代码?

哪种模式对这种情况最有意义?

1 个答案:

答案 0 :(得分:9)

构造函数注入始终是执行依赖项注入的首选方法。只有在无法进行构造函数注入时才应该恢复属性注入,例如,在处理依赖循环时(其中A依赖于B而B依赖于A)。

你可能会问这个问题的原因是,因为你在编写和维护一个有很多参数的构造函数时会感到不舒服。

拥有那么多参数是反模式(constructor over-injection anti-pattern),但解决这个问题的方法不是回归属性注入。一般来说,当拥有那么多依赖关系时,所讨论的类会做很多事情;它违反了Single Responsibility Principle。在违反SRP时,具有笨拙数量的依赖性实际上是您遇到的最少问题。违反SRP的代码更难理解,维护并且更难以测试。我可以从经验谈起。每次我发现自己在为一堂课编写单元测试时感到不舒服,我的设计出现了问题。除了SRP之外,还有其他四个重要原则,分为SOLID首字母缩略词。遵循这些原则,您将成为一名拥有更易维护软件的程序员。

当一个类违反SRP时,通常这意味着它应该分成多个类,每个类都有一个责任。执行此操作时,您将看到依赖项的数量下降。