如何在IHostedService中使用短生命周期DbContext实例?
在IHostedService中使用短生命周期DbContext的正确方式
根据.NET依赖注入指南的建议:
- 避免使用服务定位器模式。例如,在可以依赖注入的场景下,不要调用GetService来获取服务实例。
- 另一种需要避免的服务定位器变体是注入在运行时解析依赖项的工厂,这两种做法都会混合控制反转策略。
.NET官方文档中给出了两种在IHostedService中使用作用域服务的实现方式:
方式一:通过IServiceProvider创建作用域
public class ConsumeScopedServiceHostedService: BackgroundService { // ... public ConsumeScopedServiceHostedService(IServiceProvider services) { /* ... */ } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using (var scope = _services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<FooDbContext>(); // ... } } }
方式二:使用工厂委托
public class ConsumeFactoryHostedService: BackgroundService { // ... public ConsumeFactoryHostedService(Func<FooDbContext> dbContextFactory) { /* ... */ } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using (var dbContext = _dbContextFactory()) { /* ... */ } } }
但这两种实现是否都违反了上述指南要求?虽然在简单微服务等场景下影响不大,但我想了解最正确的实现方式——是否存在其他更合规的模式?具体来说:
如何在IHostedService中正确使用短生命周期的DbContext实例?
内容的提问来源于stack exchange,提问作者garuda one
相关产品推荐
相关产品推荐

