zoukankan      html  css  js  c++  java
  • Yet another way to manage your NHibernate ISessionFactory

    So here is my current UnitOfWork implementation.  This one makes use of the somewhat new current_session_context_class feature. I think this is quite simple compared to some of the others you will find.

    public interface IUnitOfWork : IDisposable
        {
            IUnitOfWork Start();
            void BeginTransaction();
            void CommitTransaction();
            void RollbackTransaction();
        }
    public class UnitOfWork : IUnitOfWork
        {
            #region Dependencies
    
            public ISessionFactory SessionFactory
            {
                get;
                set;
            }
    
            #endregion
    
            #region IUnitOfWork Members
    
            public virtual void BeginTransaction()
            {
                var session = SessionFactory.GetCurrentSession();
                if ( !session.Transaction.IsActive )
                {
                    session.BeginTransaction();
                }
            }
    
            public virtual void CommitTransaction()
            {
                var session = SessionFactory.GetCurrentSession();
                if ( session.Transaction.IsActive )
                {
                    session.Transaction.Commit();
                }
            }
    
            public void RollbackTransaction()
            {
                var session = SessionFactory.GetCurrentSession();
                if ( session.Transaction.IsActive )
                {
                    session.Transaction.Rollback();
                }
            }
    
            public IUnitOfWork Start()
            {
                if ( !CurrentSessionContext.HasBind(SessionFactory) )
                {
                    var session = SessionFactory.OpenSession();
                    session.FlushMode = FlushMode.Commit;
                    CurrentSessionContext.Bind(session);
                }
                return this;
            }
    
            #endregion
    
            #region IDisposable Members
    
            public void Dispose()
            {
                var session = CurrentSessionContext.Unbind(SessionFactory);
                var transaction = session.Transaction;
                if ( transaction.IsActive )
                {
                    transaction.Dispose();
                }
                session.Dispose();
            }
    
            #endregion
        }

    All that’s required is this in the hibernate config section:

    (for web apps):

    <property name="current_session_context_class">web</property>

    (for pretty much anything else): 

    <property name="current_session_context_class">thread_static</property>

    and just the barebones bootstrapping:

    var sessionFactory = new Configuration().Configure().BuildSessionFactory();
                

    Of course, to get this to work you need to register that sessionFactory instance into your IoC container, and register the UnitOfWork type with the container with a transient lifecycle.

    From there you can either explicitly create and dispose IUnitOfWork instances for each operation, or set up a HttpModule to create one at the start of each request and dispose of it in the end_request event.

  • 相关阅读:
    了解运行时类型信息(RTTI)
    linux培训笔记1
    Delphi 的各种错误信息(中英文)
    delphi XML 原来可以玩接口
    wxWidgets初学者导引(2)——下载、安装wxWidgets
    Delphi中ADO异步执行方式
    模态运行EXE程序
    window.setTimeout()函数的使用
    应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
    Dll方式的线程,需要引用这个
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/4629904.html
Copyright © 2011-2022 走看看