gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:57:06 31 4
gpt4 key购买 nike

我在尝试使用依赖注入(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/

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