问题:谁创建对象A?
解决方案:如果下面情况其中一个为真,则为B类分配创建对象A的责任(越多越好)
- - B包含或复合聚合A
- - B记录A
- - B密切使用A
- - B具有A 的初始化数据
例子:
public class Customer : Entity, IAggregateRoot
{
private readonly List<Order> _orders;
public void AddOrder(List<OrderProduct> orderProducts)
{
var order = new Order(orderProducts); // Creator
if (this._orders.Count(x => x.IsOrderedToday()) >= 2)
{
throw new BusinessRuleValidationException("You cannot order more than 2 orders on the same day");
}
this._orders.Add(order);
this.AddDomainEvent(new OrderAddedEvent(order));
}
}
|
如上所示, Customer类综合聚合 Orders(没有Customer的订单),记录订单,密切使用Orders并初始化方法参数传递的数据。“订单创建者”的理想候选人。
(banq:在实际中在Customer中放入创建订单的责任不是一个好主意,还要结合单一职责,如果这个客户不只是创建订单,还做其他事情,都放在Customer中违背单一职责,而且Customer主要职责不是创建订单,而是维持自身客户信息。)