工作单元模式 - 在哪里使用?

时间:2012-01-13 01:53:19

标签: nhibernate design-patterns ninject unit-of-work

我正在使用ASP.NET MVC 3并且正在使用NHibernate和Ninject的存储库和工作模式单元。我查看了几个示例(12)以帮助实现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吗?并且不用担心完全调用它来进行选择吗?这会在每个请求结束时留下挂起的交易吗?

1 个答案:

答案 0 :(得分:1)

我喜欢在每个请求周围使用ActionFilter to automatically begin/commit the unit of work。这对我95%的行为非常有用。对于少数更复杂的,我将注入UoW并从控制器或服务中明确管理它。

我通常只是将ISession注入UnitOfWork以及存储库。存储库确实没有理由知道工作单元,它根本不应该触及交易。