我想知道一种(或多种)方法来不耦合太多我的聚合,有一个具体的解释。
例如,我有一个订单,里面不能有超过100件物品。
所以我创建了一个像
这样的聚合Order {
List<Item> Items { get; private set; }
private int _maxItemCapacity = 100;
public Item AddItem(string itemName) {
if (Items.Count + 1 > _maxItemCapacity)
{
throw new Exception("You have reached the maximum limit of items");
}
var item = new Item(itemName);
Items.Add(item);
return item;
}
public Item GetItem(Guid itemId) {
var item = Items.Where(item => item.Id == itemId).First();
return item;
}
}
Item {
public Guid Id { get; private set; }
public string Name { get; private set; }
public Item(string name) {
Id = Guid.NewGuid();
Name = name;
}
}
所以现在当我想在我的订单中添加一些项目时,我将传递我的不变量,这是完美的,但是......
如果我想通过item Id在我的订单中只获取其中的一件商品,首先我需要获取我的订单以及他的所有商品,然后找到我的特定商品。
如果我有1000个项目或更多,我不想在我的订单中获得所有这些项目,我想在添加一些项目时通过我的验证(不变),但每次都不会获得所有项目订单。
如果里面没有所有物品,我如何才能获得经过这些验证的订单? (我不想在应用程序层进行这些验证)。
请不要忘记聚合是优化写入,而不是读取。因此,如果您只需要读取特定数据,而您不打算在该特定操作中进行更改,那么绕过聚合并以最有效的读取方式从数据存储中读取数据是完全可以的。
例如,如果只需要获取特定订单项的数据以将其显示在用户界面上,而不仅仅是从数据存储中读取数据。
另一方面,如果您还需要将聚合内的项目作为单独的事务写入,而该聚合不需要保证所有项目的一致性,那么您可以考虑将这些项目拆分为单独的聚合并引用这些项目通过当前聚合中的 ID。