Design patterns 存储库模式和许多级联更改

Design patterns 存储库模式和许多级联更改,design-patterns,Design Patterns,更新实体时,我需要级联许多更改。我可以像下面这样做,但这是丑陋的imho(太多的参数已经和计数) 但我不喜欢手动处理事务。我的另一个想法是 using(var batch = pageRepo.CreateUpdateBatch(page)) { if(/* path has changed */) { batch.MoveDescendants(oldPath); } // ... batch.Commit(); } 这不属于存储库。级

更新实体时,我需要级联许多更改。我可以像下面这样做,但这是丑陋的imho(太多的参数已经和计数)

但我不喜欢手动处理事务。我的另一个想法是

using(var batch = pageRepo.CreateUpdateBatch(page))
{
    if(/* path has changed */)
    {
        batch.MoveDescendants(oldPath);
    }
    // ...
    batch.Commit();
}

这不属于存储库。级联更改应该由某种工厂或服务类来管理,以协调所有更改


让您的存储库只关注检索和保存数据,而不是维护数据完整性。这些是应该放在域代码中的业务规则,而不是存储库实现。

如果最后一步失败怎么办?如果前一步事务已结束,如何回滚更改?不要在存储库中使用{}块包装代码。相反,在会话周围包装一个IUnitOfWork接口,只公开BeginTransation()和Commit()方法,然后从存储库中公开该接口。这样,您就可以从协调类而不是从存储库中调用UnitOfWork.BeginTransaction()和UnitOfWork.Commit()方法。
pageRepo.BeginTransaction();
pageRepo.Update(page);
if(/* path has changed */)
{
    pageRepo.MoveDescendants(page, oldPath);
}
// ...

pageRepo.Commit();
using(var batch = pageRepo.CreateUpdateBatch(page))
{
    if(/* path has changed */)
    {
        batch.MoveDescendants(oldPath);
    }
    // ...
    batch.Commit();
}