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;
                });
            }
        }
  • 相关阅读:
    MySQL(六)锁机制
    MySQL(七)性能优化
    Jenkins+SVN+Maven+shell 自动化部署实践
    vue中使用echarts图表自适应窗口的几种方案
    想加入或者创建一个技术交流群。偏向前端,各位大佬有推荐吗?
    Goland 2019下载和安装(带破解补丁和汉化包)
    Elementui 表单验证 点击保存定位到验证失败处
    Scheduled 参数配置
    SpringBoot @Scheduled定时任务
    centos 7 安装 SVN服务
  • 原文地址:https://www.cnblogs.com/Gyoung/p/2524796.html
Copyright © 2011-2022 走看看