IOCAutofac与ORMEntityFramwork的联系--单例模式

在你阅读之前默认你已经理解了IOC、DI、ORM以及autofac和EF的使用

在我最近写项目的时候我在单步调试时偶然发现的一个问题

先说明我的项目使用.NET MVC 三层架构,运用IOC Autofac工具和EntityFramework6

对于IOC Autofac不理解的可以去看我的博客:https://www.cnblogs.com/sandaman2019/p/11273366.html

对于EntityFramework6不理解的可以去看这个文章:https://www.cnblogs.com/wujingtao/category/816531.html

在使用IOC的时候进入单步调试项目时,IOC注册进容器时会获取实体类中的db上下文对象

RQ~M@YRZS~}G0BET2QGO9)6.png

可以看到我的_dbcontext是由一个dbcontext单例模式创建的!

那么为什么要用这个?在IOC执行时会扫描你对应的注册接口和实现类,实现类中的对于实体的操作,就需要dbcontext上下文对象

那么这个上下文对象怎么找,首先他会找到你的实体类,找到对应的实体模型类去检索上下文独享,确保有一个dbcontext对象可以去执行后续的操作

这就是对EF的请求操作,如果不通过工厂去实现就会造成同一次请求可能包含对数据库的不同操作,其他的EF对象内获取的数据可能已经是过时的,

如果不保证同一个请求中使用同一个EF上下文对象,事务工作单元模式将无法实现。而且可能造成数据混乱。

单例模式的构建对象会造成线程的不安全使用,多个对象共享一个线程池,导致线程阻塞进而引发很大的后果!

MM0M4TVWY(TTBW03W2JI56A.png

可以看到我的注释,当然你可以忽略这个实体Entities!

IOC和EF使用就必须要注意上下文的线程实例,不然会操作不恰当的事务提交!可能会造成数据被脏读,脏操作

posted @ 2019-09-17 19:30  橙发  阅读(482)  评论(0编辑  收藏  举报