C# NET Core 3.1中的依赖项注入,具有多个实现

C# NET Core 3.1中的依赖项注入,具有多个实现,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我对.NETCore中的依赖项注入感到困惑,因为我有许多相互耦合的依赖项。我有一个类MyClass实现接口IMyClass,如下所示: public class MyClass : IMyClass { private IClass classA; private IClass classB; public MyClass (ClassA classA, ClassB classB) { this.classA = classA;

我对.NETCore中的依赖项注入感到困惑,因为我有许多相互耦合的依赖项。我有一个类
MyClass
实现接口
IMyClass
,如下所示:

public class MyClass : IMyClass
{
     private IClass classA;
     private IClass classB;

     public MyClass (ClassA classA, ClassB classB)
     {
          this.classA = classA;
          this.classB = classB;
     }
     ....
}
public class ClassA : IClass
{
     public ClassA (many other DI)
     {
     }
}

public class ClassB : IClass
{
     private IClass baseClass;

     public ClassB (IClass baseClass, ...)
     {
          this.baseClass = baseClass;
          ....
     }
}
ClassA
ClassB
是接口
icclass
的实现,如下所示:

public class MyClass : IMyClass
{
     private IClass classA;
     private IClass classB;

     public MyClass (ClassA classA, ClassB classB)
     {
          this.classA = classA;
          this.classB = classB;
     }
     ....
}
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>();
services.AddSingleton();
services.AddSingleton();

有人能解释一下这里的问题和解决方案吗?

您需要在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.
var factory=ActivatorUtilities.CreateFactory(typeof(ClassB),新类型[]{typeof(IClass)});
services.AddSingleton(sp=>factory.Invoke(sp,新对象[]{sp.GetService()})作为类B)//调用sp.GetService时,您当然可以传递IClass的任何实现,而不是ClassA。当然,由于无限递归,您不能通过ClassB。
使用此解决方案,您告诉IoC容器您要为ClassB注册服务,其中:

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

您也必须注册ClassB。我们需要拼图的最后一块:如何使用ClassA和ClassB?您是否将它们都用作依赖项?你想只使用ClassB作为ClassA的装饰器吗?这两者都不起作用。我们想同时使用它们。这有点复杂,但非常感谢!这起作用了。我正试图更多地理解这一点:)