在构造函数中使用注入实现
本文关键字:注入 实现 构造函数 | 更新日期: 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
的依赖。