C# 关于SOLID principles、DI使用容器和Unity:如何管理容器中的DI映射?

C# 关于SOLID principles、DI使用容器和Unity:如何管理容器中的DI映射?,c#,dependency-injection,unity-container,solid-principles,C#,Dependency Injection,Unity Container,Solid Principles,好的。我终于理解了所有那些复杂的DI甚至IoC、容器等概念。但我还是缺少一些东西 假设我有一个名为SomeClass的类,它将在他的构造函数中安装一个实现IFirstLevelOfAbstraction的类。实现IFirstLevelOfAbstraction的类是子类1和子类2。我提到的那些类实例化了一个实现ISecondLevelOfAbstraction的类,它们是子类3和子类4 TL;博士,这是图像 在我的入口点中使用unity应该是这样的: IUnityContainer conta

好的。我终于理解了所有那些复杂的DI甚至IoC、容器等概念。但我还是缺少一些东西

假设我有一个名为
SomeClass
的类,它将在他的构造函数中安装一个实现
IFirstLevelOfAbstraction
的类。实现
IFirstLevelOfAbstraction
的类是
子类1
子类2
。我提到的那些类实例化了一个实现
ISecondLevelOfAbstraction
的类,它们是
子类3
子类4

TL;博士,这是图像

在我的入口点中使用unity应该是这样的:

IUnityContainer container = new UnityContainer();
container.RegisterType<SomeClass>();
container.RegisterType<IFirstLevelOfAbstraction, SubClass1>();
container.RegisterType<IFirstLevelOfAbstraction, SubClass2>();
container.RegisterType<ISecondLevelOfAbstraction, SubClass3>();
container.RegisterType<ISecondLevelOfAbstraction, SubClass4>();
var someClass= container.Resolve<SomeClass>();
IUnityContainer container=newunitycontainer();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
var someClass=container.Resolve();
问题是:如何选择DI在容器中的路径

i、 e
IFirstLevelOfAbstraction
的实例为
子类1
,而
的实例为第二级抽象
的实例为
子类4

以后如何轻松地更改此设置

有这么多DI嵌套不是反模式吗?为什么?这有什么好处


我觉得没人用这个。它甚至不是C#中的本机语言。

一种方法是不注册
子类1
子类2
子类3
子类4
,然后在解析时选择此类依赖项。以下是一个例子:

IUnityContainer container = new UnityContainer();

var someClass = container.Resolve<SomeClass>(
    new DependencyOverride<IFirstLevelOfAbstraction>(new ResolvedParameter<SubClass1>()),
    new DependencyOverride<ISecondLevelOfAbstraction>(new ResolvedParameter<SubClass4>()));

Class1
是否将
IFirstLevelOfAbstraction
作为构造函数参数?@YacoubMassad是的,确实如此。扔掉DI容器,改为采用;然后,您将能够自动按照您想要的方式配置依赖关系图,而无需学习另一个类库API。好的,让我先阅读您的文章,因为我认为容器方法应该“解决”使用这么多嵌套构造函数(纯DI)的需要。
var someClass =
    new SomeClass(
        new SubClass1(
            new SubClass4()));