zoukankan      html  css  js  c++  java
  • Nhibernate 3.0 cookbook学习笔记 创建事务自动包裹的访问层

    Nhibernate中,一般我们用session对数据进行增删改查时都要将session包装在一个事务()中,类似下面的代码:

     using (var tx = session.BeginTransaction())
                {
                   //这里增加增删改查处理代码
                    //...
                    tx.Commit();
                }

    每次都这样显示的去增加session.BeginTransaction()与tx.Commit()是不是很烦呢。
    我们可以直接创建一类DataAccessObject来处理这种逻辑,让session每次执行时自动的包裹在事务中

    public class DataAccessObject<T, TId>
      where T : Entity<TId>
        {
            private readonly ISessionFactory _sessionFactory;
            private ISession session
            {
                get
                {
                    return _sessionFactory.GetCurrentSession();
                }
            }
            public DataAccessObject(ISessionFactory sessionFactory)
            {
                _sessionFactory = sessionFactory;
            }
            public T Get(TId id)
            {
                return Transact(() => session.Get<T>(id));
            }
            public T Load(TId id)
            {
                return Transact(() => session.Load<T>(id));
            }
            public void Save(T entity)
            {
                Transact(() => session.SaveOrUpdate(entity));
            }
            public void Delete(T entity)
            {
                Transact(() => session.Delete(entity));
            }
    
            /// <summary>
            /// 使用委托,在方法执行的时候将方法"扔"进下面的事务中
            /// </summary>
            /// <typeparam name="TResult"></typeparam>
            /// <param name="func"></param>
            /// <returns></returns>
            private TResult Transact<TResult>(Func<TResult> func)
            {
                if (!session.Transaction.IsActive)
                {
                    // Wrap in transaction
                    TResult result;
                    using (var tx = session.BeginTransaction())
                    {
                        result = func.Invoke();
                        tx.Commit();
                    }
                    return result;
                }
                // Don't wrap;
                return func.Invoke();
            }
    
            private void Transact(Action action)
            {
                Transact<bool>(() =>
                {
                    action.Invoke();
                    return false;
                });
            }
        }
  • 相关阅读:
    Thoughtworks的技术雷达
    Stackdump: 一个可以离线看stackoverflow的工具
    我最喜欢的visual studio 2013的新特性
    把用octopress最新发布的博文同步到提供metaweblog API的博客(例如博客园)上
    博客搬家到 http://fresky.github.io/
    runnable:在线IDE+代码片段分享
    用LINQPad加上Tx驱动来分析log
    编码规范
    数论欧几里德定理的运用
    uva 11806 容斥原理+dfs
  • 原文地址:https://www.cnblogs.com/Gyoung/p/2524796.html
Copyright © 2011-2022 走看看