【发布时间】:2014-02-20 20:26:26
【问题描述】:
给定以下示例聚合:
public class Order
{
private readonly IList<OrderLine> _orderLines;
public IEnumerable<OrderLine> Lines { get { return _orderLines; } }
public Order()
{
_orderLines = new List<OrderLine>();
}
public void AddOrderLine(string sku, int qty)
{
_orderLines.Add(new OrderLine(sku, qty));
}
public void CancelOrderLine(string sku)
{
OrderLine line = _orderLines.FirstOrDefault(l => l.Sku == sku);
if (line == null)
return;
line.Cancel();
}
}
public class OrderLine
{
public string Sku { get; private set; }
public int Qty { get; private set; }
public OrderLine(string sku, int qty)
{
Sku = sku;
Qty = qty;
}
public void Cancel()
{
// do some cancellation stuff
}
}
什么是防止有人绕过聚合根并直接修改 OrderLine?例如:
foreach(OrderLine line in currentOrder.Lines)
{
line.Cancel();
}
到底有没有真正封装的聚合根?唯一的解决方案是创建一组并行的订单行值对象来代替吗?
感谢您的任何见解。
【问题讨论】:
标签: c# domain-driven-design aggregate encapsulation