在构造函数中使用注入的实现

时间:2014-03-21 15:39:37

标签: c# dependency-injection

对于含糊不清的标题感到抱歉,但我不确定如何说出来。

我正在寻找关于以下是否会对注入对象使用不良的任何想法。我在我的应用程序中设置了一个IOC容器(我正在使用Unity,但我不认为这对此非常重要)。我想知道这是不好的做法,或者是否有任何捕获从注入的接口实现在构造函数中设置变量而没有将注入的实现设置为私有变量。

在下面的示例中,{I}容器将injectedClass注入构造函数中。通常,我会将injectedClass设置为等于IInjectedClass的私有实例,但由于我只是用它来设置该单个变量,我只是在构造函数中设置变量然后忘记了关于注入的项目。

public class SomeClass
{
    private string _someVariable;

    public SomeClass(IInjectedClass injectedClass)
    {
         _someVariable = injectedClass.GetSomeString();
    }

    public void SomeMethod()
    {
         Console.WriteLine(_someVariable);
    }

}

上述代码有什么理由不好吗?或者是反对它的唯一论据,如果我想再次使用injectClass,它就不可用了?

感谢您的任何想法

3 个答案:

答案 0 :(得分:4)

这样做有几个问题。一个是它违反了Nikola Malovic的4th law of IoC

another answer here on Stack Overflow中,我概述了此规则的各种动机。

在这种特殊情况下,还存在一个额外的问题,即你的课程难以推理。当你把这个类视为一个黑盒子(这就是所有封装的内容)时,你就会看到这一点:

public class SomeClass
{
    public SomeClass(IInjectedClass injectedClass)

    public void SomeMethod()    
}

看起来好像SomeClass 需要 IInjectedClass,但事实证明它确实只需要一个字符串。这使得更难以使用,因为你必须提供一个完整的IInjectedClass实例,而当你所能得到的只是一个字符串。你可以说这违反了Postel's Law

更好的选择是诚实地遵守依赖关系,并将字符串请求为Primitive Dependency

public class SomeClass
{
    private string _someVariable;

    public SomeClass(string someVariable)
    {
         _someVariable = someVariable;
    }

    public void SomeMethod()
    {
         Console.WriteLine(_someVariable);
    }

}

答案 1 :(得分:0)

我没有看到问题。但是,您也可以立即注入字符串。您可以明确告诉您的容器名称为x的参数应填充某个字符串。

如果您这样做,则不会在IInjectedClass上创建依赖关系。

答案 2 :(得分:0)

我知道这篇文章很长,但您可以看一下:Inversion of Control