考虑下面的例子合计:DDD - 子实体封装
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
}
}
什么是防止有人从各地聚集根底部并直接修改订单行?例如:
foreach(OrderLine line in currentOrder.Lines)
{
line.Cancel();
}
有无论如何有一个真正封装的聚合根?唯一的解决方案是创建一组平行订单行值对象,而不是暴露?
感谢您的任何见解。
是的,我认为使内部的方法减少曝光,并可能会做到这一点。也被视为接口路由,但有人可以将结果转换回OrderLine对象并直接调用cancel方法。我知道这与偏执狂有关,但我想我想知道是否有一种“正确”的方式来做到这一点,提供真正的封装,或者我将不得不在这里妥协?如果我没有得到更好的答案,我会接受你的。感谢您的建议。 –