C# 工作单元和存储库模式

C# 工作单元和存储库模式,c#,design-patterns,repository-pattern,unit-of-work,C#,Design Patterns,Repository Pattern,Unit Of Work,我有一个使用NHibernate的存储库模式设置。基类如下所示: public interface IUnitOfWork : IDisposable { void Commit(); void Rollback(); } // generic NHibernate implementation of IUnitOfWork here public class NHibernateRepositoryBase<T> : IRepository<T> {

我有一个使用NHibernate的存储库模式设置。基类如下所示:

public interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

// generic NHibernate implementation of IUnitOfWork here

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    private NHibernateUnitOfWork _unitOfWork;

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
    public T Get(object id)
    {
        return _unitOfWork.Session.Get<T>(id);
    }

    // ...
}
正如你们可以推断的,我的问题是,通过设计,我现在已经失去了对工作单元生命周期的控制。之前,我将工作单元设置为上下文敏感对象,存储库将通过以下方式获取对它的引用:

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    public T Get(object id)
    {
        return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
    }

    // ...
}
公共类NHibernateRepositoryBase:IRepository
{
公共T获取(对象id)
{
返回NHibernateUnitOfWork.GetCurrent().Session.Get(id);
}
// ...
}

以前的设计允许我通过在using语句中从UnitOfWorkFactory创建工作单元来控制代码中工作单元的生命周期。我曾试图把更多的工作交给国际奥委会的容器,但我认为我实际上后退了一步。您对这两种实现的想法是什么?

让您的IoC容器尽可能多地处理通常是一件好事。在web上,工作单元模式通常在请求开始时初始化,并在请求结束时提交(如果有任何异常,则回滚)。这样,您的存储库将在构造函数而不是unitofwork中接受ISession。这样,您的存储库就不必处理提交或其他任何事务,而这些事务将自动为您处理。

但是,在这种类型的设置中,您如何处理单个事务?假设我需要在同一个会话中运行两组独立的代码,每个代码都有自己的事务。您建议如何处理?事务是通过会话处理的。使用事务不需要会话引用以外的任何东西。NHibernate会话本身基本上是一个工作单元。将其隐藏在您自己的工作单元界面后面的原因基本上是为了让您能够以通用的方式将其公开给应用程序的其余部分(存储库之外),而不依赖于NHibernate。这主要是在请求开始时初始化它,然后在请求结束时提交它。
public class NHibernateRepositoryBase<T> : IRepository<T>
{
    public T Get(object id)
    {
        return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
    }

    // ...
}