我假设您希望拥有类似于以下的代码:
public class SomeService
{
private readonly IRepositoryA _repoA;
private readonly IRepositoryB _repoB;
public void DoStuff(EntityA someEntityA, EntityB someEntityB)
{
try
{
_repoA.Save(someEntityA);
_repoB.Save(someEntityB);
// commit all stuff here
}
catch
{
// rollback all stuff here
}
}
}
如果确实如此,那么您需要有某种 UnitOfWork 抽象,这两个存储库都依赖并且可以引用它们各自的事务上下文。如果两个 repos 都使用 Nhibernate 或 IDbConnection/DbTransactions 会容易得多,但由于存在混合,您将不得不做更多的工作。
您需要创建一个包含 IDbTransaction 和 ITransaction 的“GenericTransaction”,并让您的工作单元拥有一个创建新 GenericTransaction 的方法。
GenericTransaction 上的提交/回滚将对两个事务执行相应的操作。
要做到这一点,您将不得不对现有的存储库进行相当多的重构......但我不会推荐任何其他方式。