C# NET Core 3.1中的依赖项注入,具有多个实现
我对.NETCore中的依赖项注入感到困惑,因为我有许多相互耦合的依赖项。我有一个类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;
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容器解析的所有其他依赖项