如何通过构造函数减少传递IUnityContainer对象的数量?

ZuT*_*uTa 1 .net c# dependency-injection inversion-of-control unity-container

我有一个大班级.当我的应用程序启动时,我初始化UnityContainer对象并进行配置.之后,我总是将它通过构造函数传递给层次结构中的另一个类.像这样的东西:

Unity容器将这些类作为注册:IClassA,IClassB,IClassC,IClassD

接口的所有具体实现都具有带IUnityContainer参数的构造函数.例如,

    public class ClassA : IClassA
    {

        public ClassA(IUnityContainer unityContainer)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,每当我创建某个类的新实例时,我必须传递IUnityContainer的对象.

我可以减少传递IUnityContainer对象的数量作为构造函数的参数吗?也许通过使用Dependency属性?

Pet*_*rfy 8

是的,你应该减少它.

你应该把它减少到0.

像这样使用DI容器是一种不好的做法.不要将DI容器当作神奇的超级工厂.

您应该只使用容器来更容易在组合根目录下编写应用程序:阅读本文

您的代码不应该知道它是由DI容器组成的,容器只是一种技术,而DI是一种技术.您也应该能够在没有容器的情况下编写应用程序.

那么,你如何减少它?像这样:

public class ClassA : IClassA
{
    public ClassA()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果您ClassA需要某些东西(依赖项,接口),那么您应该通过构造函数注入它.

public class ClassA : IClassA
{
    private readonly IComponent _component;        

    public ClassA(IComponent component)
    {
        _component = component;
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用其他注入模式:属性注入,方法注入,环境上下文.

如果您使用类似问题的容器,则隐藏实际类的所有依赖项.你无法弄清楚实际的类需要工作什么,因为它将使用容器来解决特定的问题.它完全取决于依赖注入,因为你不注入依赖关系,你只需注入一个通用工厂(你可以要求任何东西),这是非常危险的,并且大大增加了复杂性.

我强烈推荐这本书:.NET中的依赖注入 - Mark Seemann

  • 好.但我的问题是"如何减少......"? (2认同)