在.Net 开发中使用内置依赖注入框架注入的服务有时候我们需要在运行时获取对应的实例,这个时候就无法通过构造函数的形式来获取了。
这种情况可以使用IServiceProvider的GetService方法获取我们需要的服务实例。
使用这种方法的时候先在构造函数中获取 IServiceProvider 服务,然后就可以在方法中使用了。
参考代码:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IHttpClientFactory _clientFactory;
private readonly IServiceProvider _provider;
public Worker(ILogger<Worker> logger,
IHttpClientFactory clientFactory,
IServiceProvider provider) =>
(_logger, _clientFactory, _provider) =
(logger, clientFactory, provider);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
//使用注入的IServiceProvider服务手动获取ILogger对象
ILogger<Worker> _logger1 = (ILogger<Worker>)_provider.GetService(typeof(ILogger<Worker>));
await Task.Delay(3000 * 20 * 60 * 5, stoppingToken);
}
}
}
请避免使用 IApplicationBuilder.ApplicationServices、service.BuildServiceProvider() 的静态对象的方式获取服务。
其他请参考官方文档:依赖关系注入指南 | Microsoft Docs