首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从HostedService创建的实例中的实体框架核心ApplicationDbContext DI

从HostedService创建的实例中的实体框架核心ApplicationDbContext DI
EN

Stack Overflow用户
提问于 2021-04-19 23:47:15
回答 1查看 43关注 0票数 0

我有一个名为StateMachineHost的托管服务,我像这样创建(在Startup.cs中):

代码语言:javascript
复制
services.AddSingleton<StateMachineHost>();
services.AddHostedService<StateMachineHost>(provider => provider.GetService<StateMachineHost>());

然后,StateMachineHost从读取数据库中它应该创建多少个StateMachines开始。这是通过注入IServiceScopeFactory来完成的

代码语言:javascript
复制
public StateMachineHost(IServiceScopeFactory scopeFactory)

然后通过DI获取ApplicationDbContext,如下所示:

代码语言:javascript
复制
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就会到处都是重复的代码。

EN

Stack Overflow用户

发布于 2021-04-20 01:09:16

为什么不简单地注册您的上下文(如果您使用AddDbContext扩展,这将隐式地完成)和您的存储库作为作用域服务?将上下文注入您的repo的构造函数中,并从服务容器中获取repo,类似于您所做的……

代码语言:javascript
复制
using (var scope = scopeFactory.CreateScope())
{
itemRepo = scope.ServiceProvider.GetRequiredService<IItemRepo>();
}

当您为每个StateMachine创建一个作用域时,您将获得开箱即用的单个实例...

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67165209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档