使用 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.

的代码中

如何为 IServiceServiceImplementation 发出请求以提供相同的基础对象?

通过使用 implementationFactory-based extension method,您可以回到 IServiceProvider 的依赖关系图中,在询问接口时获得实现,甚至不会丢失编译时类型正在检查。

public void ConfigureServices(IServiceCollection services) {
    services.AddScoped<ServiceImplementation>();
    services.AddScoped<IService>(
        provider => provider.GetService<ServiceImplementation>()
    );
}

喜欢。