我刚开始学习温莎城堡。问我是否应该在Nhibernate ISession之上添加另一个工作单元。
我在windsor教程中找到了这个。
http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx
“有一个重要的,虽然我们刚刚做了什么看不见的效果。通过注册组件,我们不只是告诉温莎如何创建它们。温莎还将照顾为我们正确破坏实例,从而照顾管理他们的整个生命周期。在外行人看来,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();
}
}
}
}
答案 0 :(得分:0)
不确定,但我不会走这条路。看起来过于复杂。是否有您不想使用的原因(session.open ..){...}?