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