我有使用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容器手中的工作,但我觉得我居然花了倒退。你有什么想法在任执行?

有帮助吗?

解决方案

通常是一件好事,让你的IoC容器处理尽可能多的。在网络上工作格局的单位通常在请求开始得到初始化,并在结束时提交(回滚如果有任何例外)。这样,你的仓库将采取的ISession在构造函数代替的UnitOfWork。这样一来,你的仓库将不必应付犯或任何,这将自动为您办理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top