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)
类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;
....
}
}
Run Code Online (Sandbox Code Playgroud)
在我的启动文件中,我应该如何注册我的依赖项。我已尝试以下方法,但不起作用:
services.AddSingleton<ClassA>();
services.AddSingleton<IMyClass, MyClass>();
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这里的问题是什么以及解决方案吗?
您需要在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 注册服务: