一步一步搭建开发框架(四)EF上下文实例管理

1,博客写到四,数据库访问层封装的差不多了!这次学一下,EF上下文的实例管理,现在公司里做项目,很少有还使用原生Ado.NET的,大多数公司做协同办公之类的项目为了提高开发效率,一般都使用ORM框架,.NET方向用的比较多的就是Entity Framework,还有NHibernate,Spring.net等用的也不少!当然也有很好的微型ORM框架效率比Ado.NET还好!这次主要学习EF上下文实例的管理。

2,对上下文合理的管理有很多好处,(1),可以减少程序中出现的错误,(2),提高数据的使用效率,(3),减少上下文实例被创建的次数,节约内存,节约时间,(4),在EF4.0里面,实体只能被附加在一个EF上下文中。

3,在上一篇中,我们将获取上下文实例的代码放在了BaseDal中。为了获取实例,管理实例,一般都是将创建实例的代码放在工厂中的静态方法中,这儿我们用EF上下文的父类来接收返回值,可以做到在任意的实体模型之间切换。又封装了一个变化点。

 1 public class BaseDal<T> where T:class,new ()

 2     {

 3         DbContext dbc = EFDBContextFactory.GetCurrentDbContext();

 4     }

 5 

 6 

 7 

 8 namespace PCITC.OA.Dal

 9 {

10     public class EFDBContextFactory

11     {

12         public static DbContext GetCurrentDbContext()

13         {

14             return null;

15         }

16     }

17 }
View Code

4,有了管理上下文的工厂了,下面就是如何做到实例唯一。保证线程内实例唯一用的是CallContext这个类。CallContext类的较官方的解释意思是:类似于方法调用的线程本地存储区的专用集合对象。并提供对每个逻辑执行线程都唯一的数据槽!大致的意思就是,每个线程在被创建的时候都会分配一小块动态的内存空间,同时分配一个数据槽(类似于键值对,以键值对的方式取值,设值)!同时第二句话的意思是当前数据槽的数据只能被当前线程内执行的代码所获取!其他线程是获不到的!从而做到线程内实例唯一!这样上下文的工厂里面静态方法的代码就变成了:

 1 namespace PCITC.OA.Dal

 2 {

 3     public class EFDBContextFactory

 4     {

 5         public static DbContext GetCurrentDbContext()

 6         {

 7             DbContext db = (DbContext)CallContext.GetData("DbContext");

 8             if(db==null)

 9             {

10                 db = new DataModelContainer();

11                 CallContext.SetData("DbContext", db);

12             }

13             return db;

14         }

15     }

16 }
View Code

5,很多时候为了保证实例唯一,用单例模式比较多,但是这儿由于EF需要跟踪实体,所以用单例模式的话,上下文对象会随着实体的膨胀慢慢膨胀!不建议使用单例模式。

你可能感兴趣的:(开发框架)