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

本文关键字:注入 实现 构造函数 | 更新日期: 2023-09-27 17:51:12

关于模棱两可的标题,我很抱歉,但我不确定如何表达它。

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

在下面的例子中,injectedClass被IOC容器注入构造函数。通常,我会将injectedClass设置为IInjectedClass的私有实例,但由于我只打算使用它来设置单个变量,因此我只是在构造函数中设置变量it,然后忘记了注入的项。

public class SomeClass
{
    private string _someVariable;
    public SomeClass(IInjectedClass injectedClass)
    {
         _someVariable = injectedClass.GetSomeString();
    }
    public void SomeMethod()
    {
         Console.WriteLine(_someVariable);
    }
}

上面的代码有什么不好的原因吗?或者反对它的唯一理由是,如果我想再次使用injectedClass,它将不可用?

谢谢你的建议

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

这样做有几个问题。一是它违反了尼古拉·马洛维奇的IoC第四定律。

在Stack Overflow的另一个答案中,我已经概述了这个规则的各种动机。

在这个特殊的例子中,有一个额外的问题,它使你的类更难推理。当您将类视为一个黑盒时(这就是所有封装的作用),您将看到以下内容:

public class SomeClass
{
    public SomeClass(IInjectedClass injectedClass)
    public void SomeMethod()    
}

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

一个更好的选择是诚实地对待依赖关系,并将字符串作为原始依赖请求:

public class SomeClass
{
    private string _someVariable;
    public SomeClass(string someVariable)
    {
         _someVariable = someVariable;
    }
    public void SomeMethod()
    {
         Console.WriteLine(_someVariable);
    }
}

我不认为这有什么问题。但是,您也可以立即注入字符串。您可以显式地告诉容器名称为x的形参应该用特定的字符串填充。

如果你这样做,你就不会创建对IInjectedClass的依赖。