在托管服务中使用服务的一种好方法是在需要时创建作用域。这允许将服务/数据库上下文等与设置它们的生命周期配置一起使用。从理论上说,不创建范围可能导致创建单例DbContext和不正确的上下文重用(带有DbContext池的EF
Core 2.0)。
为此,请插入,
IServiceScopeFactory并在需要时使用它创建作用域。然后从该作用域中解析您需要的任何依赖项。如果您想将逻辑移出托管服务并仅使用托管服务来触发某些工作(例如,定期触发任务-
这将定期创建范围,在其中创建任务服务),这还允许您将自定义服务注册为范围内的依赖项。这个范围也将注入数据库上下文)。
public class MyHostedService : IHostedService{ private readonly IServiceScopeFactory scopeFactory; public MyHostedService(IServiceScopeFactory scopeFactory) { this.scopeFactory = scopeFactory; } public void DoWork() { using (var scope = scopeFactory.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>(); … } } …}


