gpt4 book ai didi

c# - 具有多种实现的 .NET Core 3.1 中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 01:19:01 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to register multiple implementations of the same interface in Asp.Net Core?

(34 个回答)


1年前关闭。




我对 .NET Core 中的依赖注入(inject)感到困惑,其中我有许多相互耦合的依赖项。我有课MyClass实现接口(interface)IMyClass如下:

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

public MyClass (ClassA classA, ClassB classB)
{
this.classA = classA;
this.classB = classB;
}
....
}
类(class) ClassAClassB是接口(interface) 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>();
有人可以解释这里的问题和解决方案吗?

最佳答案

您需要在 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 容器
  • 解决

    关于c# - 具有多种实现的 .NET Core 3.1 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62880026/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com