【问题标题】:should we use our own Unit of work on top of Nhibernate ISession我们是否应该在 Nhibernate ISession 之上使用我们自己的工作单元
【发布时间】:2011-12-25 01:33:02
【问题描述】:

我刚开始学习温莎城堡。有一个关于我是否应该在 Nhibernate ISession 之上添加另一个工作单元的问题。

我在温莎教程中找到了这个。

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx

“我们刚刚所做的事情有一个重要但不可见的效果。通过注册组件,我们不只是告诉 Windsor 如何创建它们。Windsor 还将为我们妥善销毁实例,从而照顾管理它们的整个生命周期。通俗地说,Windsor 将在不再使用这两个对象时处理它们。这意味着它将为我们将我们对 ISession 所做的更改刷新到数据库中,并清理 ISessionFactory。我们得到所有这些都是免费的。”

听起来我们不需要将更改提交到数据库,Windsor 会处理这些。我假设 Windsor 会在页面关闭或完全加载后执行此操作。

现在我看到其他人像这样在 Nhibrenate 之上添加了另一个工作单元。

只是好奇哪一个被认为是最佳实践?

            UnitOfWork unitOfWork = new UnitOfWork(session);
            Repository<Truck> repository = new Repository<Truck>(unitOfWork.Session);
            Truck truck = CreateTruck(string.Format("Truck {0}", i + 1), 1000);
            repository.Add(truck);
            unitOfWork.Commit();


            namespace RepositoryPattern.Data.Orm.nHibernate
            {
                public class UnitOfWork : IUnitOfWork
                {
                    public ISession Session { get; private set; }
                    private readonly ITransaction _transaction;

                    public UnitOfWork(ISession session)
                    {
                        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();
                        }
                    }
                }
            }

【问题讨论】:

    标签: nhibernate castle-windsor castle isession


    【解决方案1】:

    不确定,但我不会走这条路。看起来过于复杂。您是否有不想使用 using(session.open..) { ... } 的原因?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 2014-10-27
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多