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