工作单元问题 - Nhibernate(隔离级别和UoW中还有什么)

时间:2011-09-09 21:04:07

标签: nhibernate unit-of-work

我正在研究UoW模式,并有3个问题。

  public class UnitofWork : unitofwork.Models.IUnitofWork
    {
        private readonly ITransaction transaction;
        private readonly ISession session;

        public UnitofWork(ISession session)
        {
            this.session = session;
            session.FlushMode = FlushMode.Auto;
            transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
        }

        public void Commit()
        {
            if (!transaction.IsActive)
            {
                throw new InvalidOperationException("Oops! We don't have an active transaction");
            }
            transaction.Commit();
        }

        public void Rollback()
        {
            if (transaction.IsActive)
            {
                transaction.Rollback();
            }
        }

        public void Dispose()
        {
            if (session.IsOpen)
            {
                session.Close();
            }
        }
    }
  1. 我刚学习“隔离级别”,我想知道你应该使用哪一个?如果您需要为不同的交易使用多个“IsolationLevels”,会发生什么?您将如何配置您的UoW(您是否会对上述类进行多次实现?)

  2. 其他然后回滚和提交通常会进入UoW?我知道诸如创建,更新,获取查询等内容会进入存储库(如果您使用此模式)那么您还可以在其中看到什么?

  3. 我从某个网站复制了这个UoW(现在没有手头),并根据我的需要进行了更改(例如我使用的是ninject,所以我觉得UoW服用没有意义在sessionFactory中并在UoW中打开一个会话

  4. 我想知道什么是Dispose?我以前见过几次(有些似乎实现了IDispose)。

    我现在在任何代码中都没有使用它。我想知道是否有必要,因为我提到我正在使用ninject并处理会话(即我完成后关闭它)

      public void Dispose()
            {
                if (session.IsOpen)
                {
                    session.Close();
                }
            }
    

    修改

    我将此添加到我的工作单元

       public void BeginTransaction()
        {
            transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
        }
    
        public void BeginTransaction(IsolationLevel level)
        {
            transaction = session.BeginTransaction(level);
        }
    

    我从构造函数

    中删除了它

1 个答案:

答案 0 :(得分:3)

ISession本身是一个工作单元实现,因此实现自己的完全是可选的。

  1. IsolationLevel在System.Data命名空间中声明。 ReadCommitted是最常用的;这也是SQL Server的默认设置。我尝试使用Chaos只是因为我喜欢这个名字,但是SQL Server不支持它。
  2. 问题中的代码会在会话打开后立即创建一个事务,因此它是每个UOW实现的事务;请注意,如果您调用Commit或Rollback,则任何其他操作都将发生在事务范围之外。我真的不喜欢这个并且更喜欢控制我自己的事务范围,所以我会在我的UOW中有一个BeginTransaction。
  3. 实现IDisposable的类必须实现Dispose方法,并且应该在using块中使用或手动处理。这意味着该类具有需要运行的清理操作,例如关闭ISession。在这里,Dispose方法应该只调用ISession.Dispose而不是只关闭会话。