【问题标题】:DDD update collection or update referenceDDD 更新集合或更新引用
【发布时间】:2012-06-27 14:02:00
【问题描述】:

我仍然对 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 的遍历和自治,从而在集合和实例之间建立双向关系。

请帮助我了解使用哪种方式和/或我是否正确看待事物。 谢谢, 雷夫

【问题讨论】:

    标签: mapping domain-driven-design relationship updates


    【解决方案1】:

    //应该封装我知道

    由于强制封装可能会变得非常混乱,请随意放弃它。
    依赖约定 - 了解应该修改的内容和位置。

    公共虚拟客户 ReadOnlyCustomer

    您的客户是在谈论只读客户吗?我打赌不会。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2014-08-15
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多