• 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.

  • 相关阅读:
    或得最新的采购单号并改变为定长
    javaScript学习之路(1)词法结构
    如何让IE下载时下载内容自动跳转到迅雷等下载软件中
    简单的数据库查询操作
    1.1软件工程概述之软件危机
    SQL基础(巧记范式)
    给程序员的五点建议--如何成为编程高手并以此创业
    License控制解决方案
    MVC+三层+ASP.NET简单登录验证
    我曾七次鄙视自己的灵魂
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/4629904.html
Copyright © 2020-2023  润新知