DDD更新集合或更新参考

时间:2012-06-27 14:02:00

标签: mapping domain-driven-design relationship updates

我仍然围绕着ddd,所以请原谅我,如果这没有意义的话。 假设我有

public class Customer{
    public IList<Order> Orders{get;set;}  // should be encapsulated i know
}

public class Order{
    private Customer _readOnlyCustomer;
    public virtual Customer ReadOnlyCustomer { get { return _readOnlyCustomer; } }
    // possibly
    public virtual void SetCustomer(Customer customer) {_readOnlyCustomer = customer}
}

首先,我正在进行私有readonlyCustomer业务,因为我的理解是一个聚合根不应该修改另一个聚合根,虽然我不能直接强制执行这个对fluentnhibernate映射问题,我至少可以用这样的方式命名它至于警告说它不可修改。我甚至可以在映射中将该字段只读,这实际上会强制执行此操作,尽管这可能是一个问题,因为我的下一个问题,我不知道如何在客户端强制执行此操作,因为我可以从客户端获得订单customer.orders收集并修改它。对这个问题的任何想法都会受到欢迎。但我真正的问题是。

如果我要创建新订单。将订单上的客户设置并保存并让nhibernate更新Customer.Orders集合或者我应该将客户设置的订单添加到Customer.Orders集合,然后保存客户是否有意义。

当我写这篇文章时,我意识到,我以前的做法是不要在子项中引用父项,只更新父项的集合。我认为这在NH中具有db调用优势,使得处理保存变得更容易,但是更难以遍历。既然我将对象视为Ag Roots或Entities,我发现它有助于Ag Roots的遍历和自治在集合和实例之间建立双向关系。

请帮助我了解使用哪种方式和/或我是否正确查看。 谢谢, RAIF

1 个答案:

答案 0 :(得分:0)

  

//应该封装我知道

由于强制封装可能会非常混乱,因此请随意删除它 依赖惯例 - 要知道应该修改什么以及在哪里。

  

public virtual Customer ReadOnlyCustomer

您的客户是否在谈论只读客户?我没打赌。

  

如果我要创建新订单。将订单上的客户设置并保存并让nhibernate更新Customer.Orders集合或者我应该将客户设置的订单添加到Customer.Orders集合,然后保存客户是否有意义。

您没有将客户设置为订单。您不向客户添加订单。

客户订购产品。这反映了代码中的样子:

class customer
  method order(product)
    orders.Add(new Order(product))