C# 关于SOLID principles、DI使用容器和Unity:如何管理容器中的DI映射?
好的。我终于理解了所有那些复杂的DI甚至IoC、容器等概念。但我还是缺少一些东西 假设我有一个名为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
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、 eIFirstLevelOfAbstraction
的实例为子类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()));