.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;
     
     ....

ClassAClassB 类是接口 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 中的依赖注入具有多种实现 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

WPF .Net Core 3.1 依赖注入/服务参考问题

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

无法在 .net core 3.1 中注入依赖项

具有多个构造函数的 ASP.NET Core 依赖注入

如何在 ASP.NET CORE 中使用具有依赖注入的动作过滤器?

.NET Core WebAPI 依赖注入解析 null