我有一个ServiceLifetime.Scoped
依赖项,我只想为每个Web请求创建一次,但它需要满足两个服务的请求。其中一个是实现完成的接口,另一个是实现本身。现在我基本上是这样做的:
public interface IService {}
public class ServiceImplementation : IService {
public Object ImplementationSpecificState;
}
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<IService, ServiceImplementation>();
services.AddScoped<ServiceImplementation>();
}
不幸的是,这给了我两个不同的对象与每个Web请求。代码中的一个依赖于ServiceImplementation
,代码中的另一个依赖于IService
。
如何请求IService
和ServiceImplementation
提供相同的基础对象?
答案 0 :(得分:3)
通过使用implementationFactory
-based extension method,您可以返回IServiceProvider
的依赖关系图,以便在询问界面时获得实施,并且您甚至不会丢失编译时间类型检查。
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<ServiceImplementation>();
services.AddScoped<IService>(
provider => provider.GetService<ServiceImplementation>()
);
}
花式。