【问题标题】:Dependency Injection in .NET Core 3.1 with multiple implementations [duplicate].NET Core 3.1 中的依赖注入具有多种实现 [重复]
【发布时间】:2020-07-13 16:19:41
【问题描述】:

我对 .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;
     }
     ....
}

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;
          ....
     }
}

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

services.AddSingleton<ClassA>();
services.AddSingleton<IMyClass, MyClass>();

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

【问题讨论】:

  • 你也要注册ClassB。
  • 我们需要最后一块拼图:如何使用 ClassA 和 ClassB?您是否将它们都用作依赖项?你想只使用 ClassB 作为 ClassA 的装饰器吗?
  • 这也不起作用
  • 我们两个都想用

标签: c# asp.net-core dependency-injection


【解决方案1】:

需要在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 容器解决的所有其他依赖项

【讨论】:

  • 这有点复杂,但非常感谢!这行得通。我试图更多地理解这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2020-06-04
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多