.NET Core 3.1 中的依赖注入具有多种实现 [重复]
Posted
技术标签:
【中文标题】.NET Core 3.1 中的依赖注入具有多种实现 [重复]【英文标题】:Dependency Injection in .NET Core 3.1 with multiple implementations [duplicate] 【发布时间】:2020-07-13 16:19:41 【问题描述】:我对 .NET Core 中的依赖注入感到困惑,因为我有许多相互耦合的依赖项。我有一个类MyClass
实现了一个接口IMyClass
如下:
public class MyClass : IMyClass
private IClass classA;
private IClass classB;
public MyClass (ClassA classA, ClassB classB)
this.classA = classA;
this.classB = classB;
....
ClassA
和 ClassB
类是接口 IClass
的实现,如下所示:
public class ClassA : IClass
public ClassA (many other DI)
public class ClassB : IClass
private IClass baseClass;
public ClassB (IClass baseClass, ...)
this.baseClass = baseClass;
....
在我的启动文件中,我应该如何注册我的依赖项。我尝试了以下方法,但不起作用:
services.AddSingleton<ClassA>();
services.AddSingleton<IMyClass, MyClass>();
有人能解释一下这里的问题和解决方案吗?
【问题讨论】:
你也要注册ClassB。 我们需要最后一块拼图:如何使用 ClassA 和 ClassB?您是否将它们都用作依赖项?你想只使用 ClassB 作为 ClassA 的装饰器吗? 这也不起作用 我们两个都想用 【参考方案1】:需要在Startup.cs的configureservices中添加以下内容:
var factory = ActivatorUtilities.CreateFactory(typeof(ClassB), new Type[] typeof(IClass));
services.AddSingleton<ClassB>(sp => factory.Invoke(sp, new object[] sp.GetService<ClassA>()) as ClassB); //when calling sp.GetService<ClassA> you can of course pass any implementation of IClass instead of ClassA. Of course you cannot pass ClassB beacause of infinite recursion.
使用此解决方案,您是在告诉 IoC 容器您要为 ClassB 注册服务:
将他的“IClass”类型的依赖项解析为“ClassA”,因为它在 IoC 容器中声明 将拥有通常由 IoC 容器解决的所有其他依赖项【讨论】:
这有点复杂,但非常感谢!这行得通。我试图更多地理解这一点:)以上是关于.NET Core 3.1 中的依赖注入具有多种实现 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了