【发布时间】:2012-02-09 07:47:53
【问题描述】:
我正在使用 ASP.NET MVC 3,并且正在使用 NHibernate 和 Ninject 的存储库和工作单元模式。我查看了几个示例(1、2)来帮助实施 UoW,但我只是不确定在哪里我应该使用工作单元。是否应该将其注入到我的控制器中,并在我的操作中手动调用 Commit 和 Rollback?
以下是一些代码示例:
工作单元(接口扩展 IDisposable 并具有 Session、Commit 和 Rollback)
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
Session = _sessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public ISession Session { get; private set; }
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("No active transation");
}
_transaction.Commit();
}
public void Rollback()
{
if (_transaction.IsActive)
{
_transaction.Rollback();
}
}
public void Dispose()
{
if (Session.IsOpen)
Session.Close();
}
}
我的 Ninject 模块的一部分:
Bind<IXXXRepository>().To<XXXRepository>().InRequestScope();
Bind<IYYYRepository>().To<YYYRepository>().InRequestScope();
...
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
Bind<ISessionFactory>().ToMethod(x => NHibernateHelper.CreateConfiguration(Path.Combine(
HostingEnvironment.ApplicationPhysicalPath,
"bin",
"hibernate.cfg.xml")).BuildSessionFactory()).InSingletonScope();
Bind<ISession>().ToMethod(x => x.Kernel.Get<IUnitOfWork>().Session).InRequestScope();
我所有的存储库都继承自一个注入 ISession 的类,正如我在帖子前面所说的,我将 IUnitOfWork 注入我的控制器并在必要时调用 Commit 和 Rollback。我这样做对吗?我是否应该只在进行更新或删除时才调用 Commit,而不用担心调用它来进行选择?这会在每个请求结束时留下一个挂起的事务吗?
【问题讨论】:
标签: nhibernate design-patterns ninject unit-of-work