c# - 在构造函数中使用注入(inject)实现

标签 c# dependency-injection

<分区>

抱歉,标题含糊不清,但我不确定如何措辞。

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

在下面的示例中,injectedClass 被我的 IOC 容器注入(inject)到构造函数中。通常,我会将 injectedClass 设置为 IInjectedClass 的私有(private)实例,但由于我只打算用它来设置单个变量,所以我只是将变量设置为它在构造函数中然后忘记注入(inject)的项目。

public class SomeClass
{
    private string _someVariable;

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

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

}

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

感谢您的任何想法

最佳答案

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

another answer here on Stack Overflow , 我已经概述了这条规则的各种动机。

在这种特殊情况下,还有一个问题使您的类更难推理。当您将类视为黑盒时(这就是所有封装 的意义所在),这就是您所看到的:

public class SomeClass
{
    public SomeClass(IInjectedClass injectedClass)

    public void SomeMethod()    
}

看起来好像SomeClass requires 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);
    }

}

关于c# - 在构造函数中使用注入(inject)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22563160/

相关文章:

unit-testing - 如何单元测试实例创建?

c# - TreeListEx,使用模板 _StandardValues 设置的字段未从 sitecore 检索?

c# - 如何使用 DWrite 测量文本范围?

c# - 如何在上传前选择图片并裁剪?

c# - 什么在 visual studio 2013 中创建目录 "app.publish"?

c# - 找出最后一个焦点的控件

mvvm - 我应该在容器中注册 ViewModel 吗?

.net - ninject 被视为容器吗?

c# - ASP.NET Core MVC 异步加载 session

jakarta-ee - 如何将 "inject"目录路径放入 Web 应用程序以部署到 Tomcat?