使用(nHibernate)多个存储库之间的ITTraactions进行的良好实践是什么?
首先在通用接口上创建了一个BeginTransaction(),然后我开始考虑如何在存储库之间工作?我的意思是,如果从存储库中删除内容,然后从另一个存储库中删除其他内容,但是希望将整个操作包装在事务中。
虽然所有的reposistories共享相同的ISession(由DI框架处理),所以我想可以从任何存储库获得ITransaction然后提交它,它也适用于所有其他存储库。
答案 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,所以也许值得实现工作单元模式。