12

我有一个使用 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);
    }

    // ...
}

如您所见,我允许通过构造函数填充工作单元(使用 StructureMap)。我在我的 ASP.NET Web 服务上填充存储库对象,如下所示:

[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
    public IUserAccountRepository UserAccountRepo { get; set; }

    public ModuleService()
    {
        // tell IoC to inject properties
        ObjectFactory.BuildUp(this);
    }

    // ...
}

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

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

    // ...
}

以前的设计允许我通过在 using 语句中从 UnitOfWorkFactory 创建工作单元来控制代码中工作单元的生命周期。我试图将更多的工作交给 IoC 容器,但我认为我实际上倒退了一步。您对这两种实施方式有何看法?

4

1 回答 1

3

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

于 2010-01-18T11:36:31.227 回答