像NHibernate致敬-ado.net entity framework的范型DAO和open session in view实现

      最近用ado.net entity framework遇到了和NHibernate上相同的问题:

      1、open session in view如果entity的objectcontext在dao层关闭的话,在其他层访问lazy-load的属性就会出错,这都是因为上下文已经关闭的缘故,当然过早关闭上下文还会造成(1)在一次访问中多个DAO频繁的新建objectcontext造成不必要的麻烦;2、在更新或者删除时经常要为把从其他dao上下文里获取的数据附加到当前上下文这样极度繁琐的操作。(N)Hibernate做为一个老牌的orm框架通过引入open session  in view的方式避免上述问题,使得一次访问多个dao只使用一个session,而且把关闭的操作放在一次http访问的最后时间进行,也就是建个httpmodule在beginrequset事件时新建session,并在endrequest事件时提交事务并关闭,这样就可以实现透明的持久化和lzay-load。

      由于ado.net entity framework和NHibernate很相似,所以可以借鉴NHibernate的处理方式实现一个ado.net entity framework版的open session in view,代码如下。

 首先实现一个从httpcontext上下文中获取objectcontext的help类

 

EntityHelp

 

实现ihttpmodule

OSIVHttpModule

 

这样只要在dao中从help中获取objectcontext,我们进行完操作后不须显示的关闭。

 2、范型DAO

     在使用NHibernate时,范型DAO是个常用的省事技巧,将基础的crud写在范型DAO中,其他DAO只要去继承它,就可以公用一套crud方法,这在NHibernate中是很容易实现的,不过由于entity frameword比较笨拙,实现比起NHibernate要难看一些,代码如下

  1 public   class  GenericEFDao < Context,T >   where  Context:ObjectContext  where  T :  class
  2      {
  3        private Context _db = EntityHelp.GetEntity() as Context;
  4        public Context db
  5        {
  6            get return _db; }
  7        }

  8
  9
 10        CRUD
 84        
 85        help

 

     由于entity framework和NHibernate的相似性,我们可以把NHibernate中的最佳实践嫁接过来,使得在使用ado.net entity framework能够得心应手,不过由于项目还没完成,对于这样使用是否会发生 淮橘为枳的问题现在还是未可知的,只有等到系统上线的时候才能知道。

你可能感兴趣的:(Hibernate)