使用 ASP.NET 依赖注入对两个服务使用相同的实现
Use same implementation for two services with ASP.NET Dependency Injection
我有一个 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
发出请求以提供相同的基础对象?
通过使用 implementationFactory
-based extension method,您可以回到 IServiceProvider
的依赖关系图中,在询问接口时获得实现,甚至不会丢失编译时类型正在检查。
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<ServiceImplementation>();
services.AddScoped<IService>(
provider => provider.GetService<ServiceImplementation>()
);
}
喜欢。
我有一个 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
发出请求以提供相同的基础对象?
通过使用 implementationFactory
-based extension method,您可以回到 IServiceProvider
的依赖关系图中,在询问接口时获得实现,甚至不会丢失编译时类型正在检查。
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<ServiceImplementation>();
services.AddScoped<IService>(
provider => provider.GetService<ServiceImplementation>()
);
}
喜欢。