C#:在Task中使用依赖注入的Service/EFContext

dotnet core时代,依赖注入基本已经成为标配了,这就不多说了.

前几天在做某个功能的时候遇到在Task中使用EF DbContext的问题,学艺不精的我被困扰了不短的一段时间,于是有了这个文章.

先说一下代码结构和场景.

首先有一个HouseDbContext,代码大概是下面这样:

public class HouseDbContext : DbContext{   
   public HouseDbContext(DbContextOptions<HouseDbContext> options): base(options)    {}    public DbSet<Notice> Notices { get; set; } }

接着已经在StarUp.cs中初始化并注入了,注入代码是这样的:

services.AddDbContextPool<HouseDbContext>(options =>{options.UseLoggerFactory(loggerFactory);options.UseMySql(Configuration["MySQLString"].ToString());
});

有一个NoticeService.cs 会用到HouseDbContext 进行增删查改

640?wx_fmt=png

当然我们也需要把NoticeService注入到容器中,类似这样

services.AddScoped<NoticeService,NoticeService>();

现在一切都是很美好的,也能正常查询出Notice

然后某一天来了,有个需求是Update Notice之后需要把Notice同步到另外一个地方,例如Elasticsearch?

代码如下:

640?wx_fmt=png

然后一跑...

代码炸了...

恭喜你获得跨线程使用EF DbContext导致上下文不同步的异常.

错误大概长这样.

System.ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.      Object name: 'HouseDbContext'.

估计现在整个人都不好了.

这个撒意思呢?

无法访问被释放的对象。这种错误的一个常见原因是使用从依赖注入中解决的上下文,然后在应用程序的其他地方尝试使用相同的上下文实例。如果您在上下文上调用Dispose(),或者在using语句中包装上下文,可能会发生这种情况。如果使用依赖项注入,则应该让依赖项注入容器处理上下文实例。

用人话来说是什么意思呢?

这里的HouseDbContext是依赖注入进来的,生命周期由容器本身管理;

在Task.Run中再次使用HouseDbContext实例中由于已经切换了线程了,

HouseDbContext实例已经被释放掉了,无法再继续使用同一个实例,我们应该自己初始化HouseDbContext来用.

到这里的话,上次我做的时候心生一计:

既然我们不能直接从构造函数注入的HouseDbContext实例的话,我们是不是可以直接从依赖注入容器中拿一个实例回来呢?

那在dotnet core里面可以用个什么从容器中取出实例呢?

答案是:IServiceProvider

代码如下:

640?wx_fmt=png

跑一下看看...

然而事实告诉我,实例是能拿得到,然而还是会炸,错误是一样的.

原因其实还是一样的,这里已经不受依赖注入托管了,人家的上下文你别想用了.

那咋办呢...

在EF6,还可以直接new HouseDbContext 一个字符串进去初始化,在EF Core这里,已经不能这样玩了.

那可咋办呢?

翻了好多资料都没看到有人介绍过咋办,最后居然还是在官网教程里面找到了样例.

先看代码...

640?wx_fmt=png

教程代码在:Configuring a DbContext: https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext 

大功告成...

原文地址:https://www.cnblogs.com/liguobao/p/9992451.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题霸 [ 最长公共前缀] C++题解/答案

牛客题霸 [ 最长公共前缀] C题解/答案 题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 题解&#xff1a; 原本想暴力做&#xff0c;直接多层循环套&#xff0c;发现并不用 注意本题&#xff0c;给出了多组字符串&#xff0c;求它们的最长公共前缀&#xff0c;这…

pkusc2021游记

文章目录Day 0Day 1Day 2Day 3Day 0 车&#xff0c;公交&#xff0c;飞机&#xff0c;公交&#xff0c;车 坐了半天的交通终于到了&#xff0c;整个人都坐的晕乎乎的&#xff0c;然后看了下学校位置吃了饭就没事回酒店了。 Day 1 早上是报道&#xff0c;九点才开始&#xf…

codeforces82 D. Two out of Three(记忆化搜索)

D. Two out of Three 设fi,jf_{i,j}fi,j​表示为当前队伍开头的两个人是i,ji,ji,j时最小代价&#xff0c;分析可知本轮可以选择的方案有 i,ji,ji,j两人&#xff0c;fi,jaiajfj1,j2f_{i,j}a_ia_jf_{j1,j2}fi,j​ai​aj​fj1,j2​i,j1i,j1i,j1两人&#xff0c;fi,jaiaj1fj,j2f_{…

DevOps/.NET 微服务 秋季分享会领优惠门票

参与活动【活动&#xff08;深圳&#xff09;】DevOps/.NET 微服务 秋季分享会&#xff0c;优惠门票等你来领 的以下10位同学微信联系我: geffzhang 领票

bzoj3729-Gty的游戏【Splay,博弈论】

正题 题目链接:https://darkbzoj.tk/problem/3729 题目大意 给出nnn个点的一棵树&#xff0c;第iii个节点上有aia_iai​个石子&#xff0c;然后每次可以选择不超过LLL个石子移动到父节点处。要求支持操作 以一个节点的子树进行博弈是否有先手必胜修改一个节点的石子个数插入…

牛客题霸 [ 求路径] C++题解/答案

牛客题霸 [ 求路径] C题解/答案 题目描述 一个机器人在mn大小的地图的左上角&#xff08;起点&#xff0c;下图中的标记“start"的位置&#xff09;。 机器人每次向下或向右移动。机器人要到达地图的右下角。&#xff08;终点&#xff0c;下图中的标记“Finish"的位…

【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

上篇文章我介绍了如何在网关上增加自定义客户端授权功能&#xff0c;从设计到编码实现&#xff0c;一步一步详细讲解&#xff0c;相信大家也掌握了自定义中间件的开发技巧了&#xff0c;本篇我们将介绍如何实现自定义客户端的限流功能&#xff0c;来进一步完善网关的基础功能。…

codeforces855 C. Helga Hufflepuff‘s Cup(树形dp)

C. Helga Hufflepuff’s Cup 比较经典的树形dp套路。由于题目限制某类点的数量&#xff0c;因而状态需要记录一下子树中该特殊点的数量。 设计dp&#xff1a; fu,j,kf_{u,j,k}fu,j,k​以uuu为根的子树中&#xff0c;选了jjj个特殊值&#xff08;点权K&#xff09;&#xff0c…

牛客题霸 [链表中倒数第k个结点] C++题解/答案

链表中倒数第k个结点 题解&#xff1a; 我们把链表存两份&#xff0c;让其中一个先走k个节点&#xff0c;然后两个链表一起走&#xff0c;直到第一个链表到头&#xff0c;因为两个相差k个节点&#xff0c;所以第二个链表停的位置就是倒数第k个 代码&#xff1a; /* struct …

P3343-[ZJOI2015]地震后的幻想乡【dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/P3343 题目大意 给出nnn个点的一张无向图&#xff0c;每条边被修复的时间是[0,1][0,1][0,1]的一个随机实数&#xff0c;求这张图联通期望时间。 1≤n≤10,m≤n(n−1)21\leq n\leq 10,m\leq \frac{n(n-1)}{2}1≤n≤10,m≤2n(n…

codeforces229 D. Towers(dp+贪心)

D. Towers 设计dp&#xff1a; fif_ifi​表示考虑到iii时满足题意的最小代价。 考虑最后一步&#xff0c;也就是最后一组合并即fifj{aj1⋯ai}f_if_j\{a_{j1}\dotsa_i\}fi​fj​{aj1​⋯ai​} 在满足最优条件的同时让当前aia_iai​最小&#xff08;贪心&#xff09; #include&…

1.14 日志(递推ybtoj)

明天要模拟&#xff0c;n年未碰电脑&#xff0c;先不学新的了。。。。 1.错排问题 dp最棒了 code: #include #include #include #include #include using namespace std; const int MINT_MAX; long long f[25][25]{ };//f[i][j]表示有i个数&#xff0c;其中j个数可以随便填 …

牛客题霸 [买卖股票的最好时机] C++题解/答案

买卖股票的最好时机 题解&#xff1a; 设两个变量&#xff0c;一个为minn&#xff0c;一个为maxx 当遇到比当前minn还小的价钱时&#xff0c;就更新minn 当与minn大时&#xff0c;就计算如果这个价卖出&#xff0c;赚多少钱&#xff0c;maxx不断更新取最大值 这样&#xff0c…

P7600-[APIO2021]封闭道路【堆,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7600 题目大意 给出nnn个点的一棵树&#xff0c;边有边权&#xff0c;对于每个kkk求去掉最小边权和的点使得每个点的度数都不超过kkk。 1≤n≤1051\leq n\leq 10^51≤n≤105 题目大意 APIO遇到的原题&#xff0c;和CF1119F…

codeforces1497 D. Geniue(dp+图论)

D. Geniue Frozen_Guardian题解 Implicit_总结 首先把此序列看作一个完全图&#xff0c;然后按照边权从小到大的顺序枚举边。 如何按照边权从小到大枚举边? 下面考虑形如边(a,b)(a,b)(a,b)都默认a<ba<ba<b。 任意考虑两条边(a,b)(a,b)(a,b)和(c,d)(c,d)(c,d)&…

1.16 模拟(排序)

# 总结 845分 我好菜啊qwq 第九题&#xff08;站队&#xff09;出了bug。。。 没有考虑到中位数会存在重叠错误问题&#xff08;直接卡掉5个点就离谱&#xff09; 后来发现其实第九题暴搜也能过。。。&#xff08;要是IOI赛制就能ak了&#xff09; 前面的水题不贴了 # 9.士兵站…

牛客题霸 [判断一个链表是否为回文结构] C++题解/答案

判断一个链表是否为回文结构 题目描述 给定一个链表&#xff0c;请判断该链表是否为回文结构。 题解&#xff1a; 直接将链表内的数据存入string中&#xff0c;然后从两端开始向中间判断即可 代码&#xff1a; /*** struct ListNode {* int val;* struct ListNode *next;…

HDU6736 F.Forest Program(dfs找环)

F.Forest Program 千摆渡题解 找环可以使用dfs一遍求出。 方法为&#xff1a;vis数组设置为三种状态&#xff0c;0表示未被访问过。1表示正在被访问&#xff0c;即边指向的结点是当前结点在dfs树上的祖先节点。2表示访问完毕。同时dfs的同时记录每一个结点的先驱pre。如果边访…

P7324-[WC2021]表达式求值【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7324 题目大意 给一个只包含mmm个值的表达式&#xff0c;<<<表前后取最小值&#xff0c;>>>表前后取最大&#xff0c;???可以是小于也可以是大于。 然后nnn次给出这mmm个值&#xff0c;所有方案下表达…

平面分割 题解(1.16 递推模拟)

平面分割 代码一行&#xff0c;解析一箱~~ 解析 计f[i]&#xff1a;从1到i累加之和 先假设最好情况&#xff0c;p2&#xff1b; 此时第一条会增加1个 第二条与第一条相交&#xff0c;再加2个 第三条与前2条相交&#xff0c;再加3个 … 故n条时共增加f[n]个&#xff0c;共f[n]…