架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11803|回复: 2

[资料] EF DbContext 保证上下文唯一

[复制链接]
发表于 2020-8-22 10:21:31 | 显示全部楼层 |阅读模式
使用EF操作数据库,在同一个HTTP请求将DbContext(数据库操作上下文类)提取出来,保证唯一,文章使用两种方案保证 Entity Framework 上下文唯一,另外,附上在 .NET Core 平台的解决方案。

方案一

如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢?

数据槽:CallContext,ok看下msdn对callcontent的解释。

CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。

也就是说,当前线程对对象进行储存到线程本地储存区,对象随着线程的销毁而销毁。

使用代码:



使用场景:我个人认为,当对象需要线程内全局使用,而其他线程包扩子线程都不能访问的时候使用。比如EF的数据上下文,每次请求都会生成一个线程处理请求,这时候创建一个数据上下文对象给不同的函数使用,最后一起提交就完全可以避免事务的问题。当然也许有人会问我可以创建一个变量来使用,同样可以达到一样的目的,这当然也是可以的,只是这个对象你也是可以和其他线程数据进行交互的,这就违背了线程内唯一的概念了。

方案二

基于 web http 请求的方案,因为每一次请求,都是一个新的线程,代码如下:



在 .NET Core 中使用 “CallContext”

我们知道,CallContext已经不适用于 .NETStandard 或 .NET Core 。

但是可以使用 Asynclocal<T> 来模仿 CallContext ,只需要创建以下静态类:



需要引用的命名空间:



使用也很简单(这里我把CallContext放在Common类库中了):





上一篇:ASP.NET MVC5 使用预编译模式发布,提高页面加载速度和性能
下一篇:【转】.NET 将 PPT 导出为图片
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2020-8-25 23:38:22 | 显示全部楼层
用注入不香吗
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2020-8-26 21:37:39 | 显示全部楼层

asp.net core 默认的注入生命周期,无法满足我的需求

Singleton:IServiceProvider对象创建的服务实例保存在作为根容器的IServiceProvider对象上,所以多个同根的IServiceProvider对象提供的针对同一类型的服务实例都是同一个对象。
Scoped:IServiceProvider对象创建的服务实例由自己保存,所以同一个IServiceProvider对象提供的针对同一类型的服务实例均是同一个对象。
Transient:针对每一次服务提供请求,IServiceProvider对象总是创建一个新的服务实例。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-26 11:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表