我有一个名为StateMachineHost的托管服务,我像这样创建(在Startup.cs中):
services.AddSingleton<StateMachineHost>();
services.AddHostedService<StateMachineHost>(provider => provider.GetService<StateMachineHost>());然后,StateMachineHost从读取数据库中它应该创建多少个StateMachines开始。这是通过注入IServiceScopeFactory来完成的
public StateMachineHost(IServiceScopeFactory scopeFactory)然后通过DI获取ApplicationDbContext,如下所示:
using (var scope = scopeFactory.CreateScope())
{
dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var itemRepository = new ItemRepository(dbContext);在using语句的后面,我继续创建N数量的StateMachines。每个StateMachine还需要通过ItemRepository访问数据库。现在的问题是,我如何在我的StateMachines中依赖注入ApplicationDbContext?定时器想要在任何其他给定点(由WebApi调用和/或StateMachine -Tick触发)访问数据库。
我的StateMachineHost将每个StateMachine存储在一个列表中,这意味着StateMachine实例在整个应用程序生命周期中都存在。
在WebApi/Repository模式中,可以通过控制器构造函数中的ASP.NET核心轻松地注入ApplicationDbContext。但是由于我的StateMachine有它自己的状态和逻辑,我不明白我应该如何创建/DI ApplicationDbContext。据我所知,对于每个数据库访问,都应该重新创建ApplicationDbContext和存储库。这意味着我也想以某种方式将这些代码封装在我的StateMachine中,否则仅仅创建一个ApplicationDbContext就会到处都是重复的代码。
发布于 2021-04-20 01:09:16
为什么不简单地注册您的上下文(如果您使用AddDbContext扩展,这将隐式地完成)和您的存储库作为作用域服务?将上下文注入您的repo的构造函数中,并从服务容器中获取repo,类似于您所做的……
using (var scope = scopeFactory.CreateScope())
{
itemRepo = scope.ServiceProvider.GetRequiredService<IItemRepo>();
}当您为每个StateMachine创建一个作用域时,您将获得开箱即用的单个实例...
https://stackoverflow.com/questions/67165209
复制相似问题