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,一经查实,立即删除!

相关文章

pkusc2021游记

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

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

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

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

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

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个数可以随便填 …

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

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

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

本来这篇只是想简单介绍下ASP.NET Core MVC项目的&#xff08;毕竟要照顾到很多新手朋友&#xff09;&#xff0c;但是转念一想不如来点猛的&#xff08;考虑到急性子的朋友&#xff09;&#xff0c;让你通过本文的学习就能快速的入门ASP.NET Core。既然是快速入门所以过多过深…

题解: 区间合并(opj 2-4-7620)

一开始轻视这道题了&#xff0c;想用各种各样奇怪的区间标记把这道题水掉&#xff0c;结果WA声一片。。&#xff08;我大意了&#xff0c;没有AC&#xff01;&#xff09; 后来大脑开始思考&#xff0c;贪心解决掉了&#xff0c;AC快乐~~&#xff08;忽略这道题来自分治…qwq&a…

牛客题霸 [二叉搜索树的第k个结点]C++题解/答案

牛客题霸 [二叉搜索树的第k个结点]C题解/答案 题目&#xff1a; 给定一棵二叉搜索树&#xff0c;请找出其中的第k小的结点。 题解&#xff1a; 二叉搜索树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空&#xf…

内部设计师揭秘!王者峡谷中竟有隐藏的c++代码??!!腾讯已经炸了!!!

解析 模拟的时候用关于n的一元二次方程实根公式解的不亦乐乎。。。后来经高人提醒才发现万物皆为斐波拉契。。 就很《离谱》 于是代码就不难了 也算有收获吧&#xff0c;遇到这种看起来莫名其妙的题时&#xff0c;不着急死磕&#xff0c;可以先写个上图一样的程序找找规律 “实…

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

写在前面上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它&#xff0c;接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目&#xff0c;同时又通过一个实战教你如何在页面显示一个Content的列表。不知道你有没有跟着敲下代码&#xff0c…

对.NET Core未来发展趋势的浅层判断

经常听到园里.NET开发人员在抱怨生态不如JAVA&#xff0c;想要转JAVA&#xff0c;所谓打不过你&#xff0c;我就加入你&#xff01;杜兰特的思维方式固然是获取总冠军的一种方式&#xff0c;但是我们要关起门来问自己有没有杜兰特的实力。用开发生态来类比NBA不是特别恰当&…

2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是&#xff1a;不能是任意两个数的差以及他们的因数&#xff0c;因此只需用用FFT求出这些数的差&#xff0c;记为差的集合。 从小到大考虑一个答案&#xff0c;以及答案的倍数是不是上述差的集合&#x…

priority_queue+贪心:运输(题解)

解析 不难发现每次都应合并最大的一对&#xff0c;从而使局部最优带动整体最优 sort就会很自然的想到 但是问题是合并完之后的新值可能已经不是当前最大了&#xff08;WA。。qwq&#xff09; 于是想到每次循环sort一遍&#xff0c;结果n^2logn又超时了。。。 在一位高人的指引…

【话题揭秘】某大型国有银行的敏捷落地实践

“某大型国有银行的敏捷落地实践”话题介绍银行行业是强烈依赖IT的非IT行业&#xff0c;传统金融要想打破现有局面&#xff0c;除了要解决外因&#xff0c;还要突破内部因素&#xff0c;其中一点就是技术重塑和战略手段&#xff0c;也就是常说的数字化转型&#xff0c;这也是经…

震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!

解析 经典大法师&#xff08;dfs哈哈哈&#xff09; 比较关键的是每条对角线上点的坐标之和或差是相同的&#xff0c;故可以用一维数组存储其状态 这题一开始用了双层循环&#xff0c;卡掉了4个点qwq 后来发现其实因为每行只有一个皇后&#xff0c;每次单层循环枚举j就可以实…

直播视频发布:Windows上的Linux容器和Azure混合云中的Kubernetes(k8s)

如果你还没有开始关注容器&#xff0c;那么你已经out了&#xff1b;如果你还在单机上运行容器&#xff0c;那么你out了。经过2013到2018年5年的演化&#xff0c;分化和进化&#xff1b;容器&#xff0c;Docker和Kubernetes已经是任何一家企业的IT解决方案都不能忽视的重要趋势。…

通过Microsoft Learn进行学习以提升技能

通过 Microsoft Learn&#xff0c;可以免费而且轻松有趣地学习 Microsoft 技术。Microsoft Learn的与众不同借助 Microsoft Learn&#xff0c;任何人都能按自己的学习计划和速度掌握重要的知识和概念。 使用者将能够访问培训资料、代码示例&#xff0c;以及免费试用产品。无论是…

asp.net core webApi 参数保护

Introasp.net core data protection 扩展&#xff0c;基于 IDataProtector 扩展的数据保护组件&#xff0c;自动化的实现某些参数的保护ParamsProtectionParamsProtection 是为了保护 asp.net core webapi 项目的某些参数而设计的&#xff0c;也可以用来做一定程度上的反爬虫。…

2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

J-Product of GCDs Code1 对于每个质数以及每个质数的次幂单独考虑他们的贡献&#xff0c;由于多次使用快速幂导致TLE #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!is…

新汉诺塔(洛谷P1242)含第11个数据的解决办法

解析 应该从大到小一个个移&#xff0c;这样后面大盘就可以直接忽略&#xff0c;保证没有冗余操作&#xff0c;必定最优&#xff08;如果先移动小的&#xff0c;后面移动大的时还要动小的&#xff09; 对于第id个从当前位置到目标的移动有两种移动方案&#xff1a; 法1&#x…