.NET Core 3.1 中的依赖注入具有多种实现

Nan*_*hal 5 c# dependency-injection asp.net-core

我对 .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;
     }
     ....
}
Run Code Online (Sandbox Code Playgroud)

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;
          ....
     }
}
Run Code Online (Sandbox Code Playgroud)

在我的启动文件中,我应该如何注册我的依赖项。我已尝试以下方法,但不起作用:

services.AddSingleton<ClassA>();
services.AddSingleton<IMyClass, MyClass>();
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里的问题是什么以及解决方案吗?

use*_*993 5

您需要在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.
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,您可以告诉 IoC 容器您想要为 ClassB 注册服务:

  • 将其类型“IClass”的依赖项解析为“ClassA”,因为它是在 IoC 容器中声明的
  • 将具有通常由 IoC 容器解析的所有其他依赖项