Cha*_*lie 8 domain-driven-design
对不起,如果它是重复的,我已经搜索了很多,但我找不到匹配的问题.
我知道我们不应该在一个事务中更新多个聚合实例.但是,我认为"多个聚合实例"在这里意味着不同聚合类型的多个实例.我对吗?
比如,Product和BacklogItem是两个不同的聚合,因此我们应该避免在一个事务中更新Product和BacklogItem.
但是,如果我需要更新相同聚合类型的多个实例呢?说,我需要更新所有产品的名称.处理它的最佳方法是什么?
伪代码
//Application Service
public void ChangeTitle(string newName)
{
using(uow.BeginTransaction())
{
IEnumerable<Product> products = repo.GetAll();
foreach(var product in products)
{
product.ChangeName(newName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
AR 的类型无关紧要,AR 始终是交易边界。与其中许多人一起工作时,您通常应该接受部分失败和最终的一致性。
如果在所有这些 AR 中都没有要保护的不变量,为什么所有重命名都会失败或成功。例如,如果 UI 确实允许用户一次重命名多个产品,而某些用户重命名数百个产品。例如,如果一个产品因为并发冲突而无法重命名,最好不要重命名任何产品或通知用户其中一个产品失败?
您总是可以违反规则,但您必须明白,事务中涉及的 AR 越多,您就越有可能因并发冲突(假设可能发生争用)而遇到事务失败。
当存在跨越 AR 边界的不变量并且我无法避免处理最终一致性时,我通常只在一个事务中修改多个 AR。