我有一个使用 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 容器,但我认为我实际上倒退了一步。您对这两种实施方式有何看法?