C# 依赖注入(inject) - 注入(inject)采用相同接口(interface)作为参数的接口(interface)

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

我在尝试使用依赖注入(inject)时遇到了一些麻烦,需要帮助。

我有一个服务 IService,它在我的应用程序中以几种不同的方式实现。

ServiceA : IService { public ServiceA(IDependencyA A, IDependency B) {...} }
ServiceB : IService { public ServiceB(IDependencyA A, IDependency B) {...} }
ServiceC : IService { public ServiceC(IService serviceA, IService serviceB) {...} }

在我的 startup.cs 文件中,我将根据配置文件中的参数选择使用哪个。像这样:

var service = Configuration["AppConfig:Service:ID"];
switch(service) {
    case "A":
        services.AddTransient<IService, ServiceA>();
    case "B":
        services.AddTransient<IService, ServiceB>();
    case "C":
        // ??
}

我能够非常轻松地创建和使用服务 A 和服务 B。我事先注入(inject)了它们的依赖项 A 和 B,它们创建得很好。问题出在第三个服务上。我需要将另外两个服务注入(inject)其中。我的问题是:最好的做法是什么?

有没有一种方法可以创建服务 A 和 B 的具体实现,但以某种方式在它们的构造函数中使用注入(inject)的依赖项 A 和 B?我是否必须弄乱接口(interface)才能让它工作?也许我必须更改 ServiceC 的构造函数以接受 A 和 B 的具体实现?

更新:不知道这是否是最佳解决方案,但我最终执行了以下操作以使其正常工作。

...
case "C":
    services.AddTransient<ServiceA>();
    services.AddTransient<ServiceB>();
    services.AddTransient<IService>(s => 
        new ServiceC(
            s.GetService<ServiceA>(),
            s.GetService<ServiceB>()
    ));

最佳答案

另一种选择。引入另一个接口(interface),因此您可以同时注册 ServiceC 及其依赖项,而不会出现任何歧义或循环引用。

interface IService {}
interface IServiceImpl : IService {}

ServiceA : IServiceImpl { public ServiceA(IDependencyA A, IDependency B) {...} }
ServiceB : IServiceImpl { public ServiceB(IDependencyA A, IDependency B) {...} }
ServiceC : IService { public ServiceC(IEnumerable<IServiceImpl> services) {...} }

services.AddTransient<IServiceImpl, ServiceA>();
services.AddTransient<IServiceImpl, ServiceB>();
services.AddTransient<IService, ServiceC>();

关于C# 依赖注入(inject) - 注入(inject)采用相同接口(interface)作为参数的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63693802/

相关文章:

c# - 如何使用 LINQ 延迟加载 where 条件

routing - .NET Core RC2 中的小写 URL

asp.net-core - System.Web 已在 ASP.NET 5 中删除,那么如何找到新位置?

c# - 如何将 Fluent MEF 注入(inject) WCF

PHP - 如果自动加载,为什么要使用依赖注入(inject)?

c# - LINQ to SQL 从字符串创建查询

c# - 向量和矩阵是引用类型还是值类型? Math.Net 数值

c# - Windows 窗体进度条 : Easiest way to start/stop marquee?

asp.net-core - 如何在 AspNetCore 2.2 NLog 中关闭 Microsoft 日志

c# - C# 或其他语言中的 Scala 风格抽象模块?