一个NHibernate应用的实际例子(A good open source project to learn how to use NHibernate)

    技术2022-05-19  19

    此项目名字叫Cuyahoga,是一个CMS。该项目中就使用了NHibernate0.6作为持久层。并且使用了NHibernate0.6新添加的Lazy loading特性,是学习使用NHibernate的上佳例子。 下面是对他的一些评价: - Use the HttpContext to store your NHibernate session facade. This is what I call the HttpContext Local Session pattern 8-)    使用HttpContext .Item来存储NH的Session,亦即使用了HttpRequest--Session的模式 - Access to the session facade is provided by a property get in your overrided ASP.NET page's base class, such as "base.GetCoreRepository.LoadObjectById(..)". This is an alternative to having the repository itself control instantiation such as "CoreRepository.Instance.LoadObjectById(..)"    CoreRepository就是一个数据访问逻辑组件了,对Session进行了管理,并且提供数据持久化的方法。部分代码如下:

         public   class  CoreRepository      {         private ISessionFactory _factory;         private ISession _activeSession;         /// <summary>         /// Get the active NHibernate session.         /// </summary>         public ISession ActiveSession         {             get return this._activeSession; }         }         /// <summary>         /// Create a repository for core objects.         /// </summary>         public CoreRepository() : this(false)         {         }         /// <summary>         /// Create a repository for core objects.         /// </summary>         /// <param name="openSession">Indicate if the CoreRepository should open a session and keep it in memory.</param>         public CoreRepository(bool openSession)         {             this._factory = SessionFactory.GetInstance().GetNHibernateFactory();             if (openSession)             {                 this._activeSession = this._factory.OpenSession();             }         }         /// <summary>         /// Open a NHibernate session.         /// </summary>         public void OpenSession()         {             if (this._activeSession == null || ! this._activeSession.IsOpen)             {                 this._activeSession = this._factory.OpenSession();             }             else             {                 throw new InvalidOperationException("The repository already has an open session");             }         }         /// <summary>         /// Flushes the current active NHibernate session.         /// </summary>         public void FlushSession()         {             if (this._activeSession != null && this._activeSession.IsOpen)             {                 this._activeSession.Flush();             }         }         /// <summary>         /// Close the active NHibernate session         /// </summary>         public void CloseSession()         {             if (this._activeSession != null && this._activeSession.IsOpen)             {                 this._activeSession.Close();             }         }         Generic methods            }

    - A new NHibernate Open Session at beginning of a web request and close it at the end of the request. This is the "session-per-request" pattern.  - Using a custom IHttpModule called NHSessionModule to provide the handlers for Context_BeginRequest and Context_EndRequest. This is a nice way of automatically wiring up your creation/opening and closing and sessions.   使用了一个HttpModule 来进行Session的存储和获得,代码如下:

    using  System; using  System.Web; using  Cuyahoga.Core.Service; namespace  Cuyahoga.Web.Util {     在一个HTTP Request期间管理NHibetnate的Session }

    也就是将session保存到HttpContext.Current.Items中,这样做的好处请看这里。 NHibernate中添加的最重要的特性就是用proxy对延迟加载的支持(包括对集合的和单个object的延迟加载),这也是因为项目中使用了动态代理技术(这要求业务实体的成员需要是virtual的或者实现某个接口), 这为多表的join带来了性能上的提升。


    最新回复(0)