如何处理几个通用IRepositories之间的事务

时间:2009-08-24 18:58:59

标签: nhibernate

使用(nHibernate)多个存储库之间的ITTraactions进行的良好实践是什么?

首先在通用接口上创建了一个BeginTransaction(),然后我开始考虑如何在存储库之间工作?我的意思是,如果从存储库中删除内容,然后从另一个存储库中删除其他内容,但是希望将整个操作包装在事务中。

虽然所有的reposistories共享相同的ISession(由DI框架处理),所以我想可以从任何存储库获得ITransaction然后提交它,它也适用于所有其他存储库。

2 个答案:

答案 0 :(得分:2)

不使存储库负责事务管理。 不要将ISession直接注入存储库,而是使用一个工作单元来保存会话并启动并提交事务。

INHibernateUnitOfWork
{
   ISession CurrentSession { get; }
   void Start(); // begins the transaction
   void Commit();
   void RollBack();
}

答案 1 :(得分:0)

我可以代替使整个类变得通用,只需使每个函数都是通用的,如下所示:

public interface IRepository
{
    T Get<T>(int id);
    T SingleOrDefault<T>(Func<T, bool> query);
    IQueryable<T> Where<T>(Expression<Func<T, bool>> query);
    IQueryable<T> All<T>();
    void Save<T>(T entity);
    void Delete<T>(T entity);
    ITransaction BeginTransaction();
}

然后接口或多或少依赖于nHibernate,所以也许值得实现工作单元模式。