【发布时间】:2016-03-18 01:40:48
【问题描述】:
所以我仍在努力达到那个“啊哈!”聚合和聚合根的时刻(什么是新的,对吗?),我看到 Martin Fowler 说过以下内容:
聚合将使其组件对象之一作为聚合根。来自聚合外部的任何引用都应该只转到 聚合根。因此,根可以确保数据的完整性 聚合为一个整体。
因此,我正在阅读此内容,因为聚合是父对象,并且聚合中的对象之一被选为聚合根。此聚合之外的任何内容都只能包含对根的引用。这让我很困惑。如果根是聚合的part,它怎么能保证什么?
据我了解,聚合的全部目的是 a) 作为域对象(值对象和其他聚合)的逻辑分组,b) 作为与聚合的所有交互必须发生的事务边界,并且该回购仅处理聚合。但是假设我有这样的聚合:
public class UserInventory
{
private List<InventoryItem> _inventoryItems;
// the aggregate root
public User User { get; }
public ReadOnlyCollection<InventoryItem> Inventory => _inventoryItems;
public UserInventory(User root, IEnumerable<InventoryItem> inventory)
{
User = root;
_inventoryItems = inventory;
}
public void UpdateItemDescription(Guid itemId, ItemDescription newDescription)
{
_inventoryItems.Single(i => i.Id == itemId).Description = newDescription;
DomainEvents.Notify(new InventoryItemUpdated(User));
}
}
现在我的应用层想要更改特定库存项目的描述,因此,由于它不应该直接与库存项目对话,我公开UpdateItemDescription(Guid, ItemDescription) 来控制这个过程,因为这将是聚合的机会强制执行任何不变量(为了清楚起见,我省略了)
我觉得这是一个不错的聚合示例,但我不明白聚合根如何在这里“确保完整性”。我查看了 C# DDD 示例应用程序,但找不到任何明显的问题答案,但请随时在您的答案中引用它。
谁能澄清一下?我是否遗漏了什么或误解了什么?
【问题讨论】:
-
虽然 DDD 一开始就像是设计和编码的混合体,但如今它是一种应用程序设计方法(识别领域模型),但它保留了旧名称,例如 value object 或聚合根。问题是,现在许多开发人员都在使用函数式方法,他们没有很多对象,但是他们在做 DDD 并且他们实现聚合根作为函数。可以说 AR 是负责执行聚合一致性规则的聚合的门面,不管它是如何实现的。