我在尝试使用依赖注入时遇到了一些麻烦,需要帮助。
我有一个服务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。在它们被创建之前,我会提前注入他们的依赖项A和B。问题出现在第三个服务上,我需要将前面两个服务注入到它中。我的问题是:最好的方法是什么?
是否有一种方法可以创建服务A和B的具体实现,但在它们的构造函数中以某种方式使用注入的依赖项A和B?我是否必须更改接口来使其工作?也许我必须改变ServiceC的构造函数,以获取A和B的具体实现?
更新:不知道这是否是最佳解决方案,但我最终采取了以下措施使其起作用。
...
case "C":
services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<IService>(s =>
new ServiceC(
s.GetService<ServiceA>(),
s.GetService<ServiceB>()
));
IService
而不知道它的含义。如果有两个具体实现,为什么不传递相同的实例?或者两个A实例?或者两个B实例? - Panagiotis Kanavos