【问题标题】:What is a good practice with a Repository and Business objects?存储库和业务对象的良好做法是什么?
【发布时间】:2010-08-02 09:59:21
【问题描述】:

我有几个业务类,如地址、产品、订单、订单行。在这种情况下,我有一个关于我的 Order 类以及如何在存储库中更新它的问题。

Order 类可以有多个 OrderLine。该类如下所示:

class Order {
  private List<OrderLine> orderLines;

  public Address CustomerAddress { get; set; }
  public Address DeliveryAddress { get; set; }

  public void Add(OrderLine line) {
    // stuff to add order line.
  }

  public void Remove(int index) {
    // stuff to remove order line by index.
  }
}

当我需要获取订单时,我可以执行以下操作:

Order myOrder = Orders.Get(5); // Gets the order with ID 5 from repository.

现在,我可以根据需要添加或删除订单行并修改 CustomerAddress 或 DeliveryAddress。

当我想更新修改后的订单时,我可以这样做:

bool updated = order.Update();

在内部调用 Orders 存储库的 Update 方法,例如:

public bool Update() {
  return Orders.Update(this); // Let repository handle updating of this order.
}

现在假设我之前使用 Orders.Get(5) 获得的订单有 10 个订单行,我修改了 1 个订单行,添加了 1 个订单行并删除了 1 个订单行。

假设我分配了不同的收货地址:

myOrder.DeliveryAddress = Addresses.Get(64); // Get address with ID 64 from repository and assign it to order.

Order Repository 的 Update 方法应该发生什么?

是否应该更新整个订单,包括所有订单行,删除已删除的订单行,保存添加的订单行并更新已更改的订单行?

我有点不知所措,因为当所有这些内部项目(地址和订单行)都必须更新、插入或删除时,它变得非常复杂。

有人有建议吗?

提前非常感谢你:)

【问题讨论】:

    标签: c# object repository


    【解决方案1】:

    如果您遵循领域驱动设计学派,您会将您的模型参与聚合,其中每个聚合将包含许多相关的类、Order、OrderLine 等。在每个聚合中,一个类被指定为聚合根,例如Order,并负责管理聚合中所有对象的模型完整性。 在 DDD 存储库中,对对象的聚合而不是单个对象进行操作。究竟如何将模型参与聚合可能很困难,但一旦你这样做了,责任就会变得清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2021-11-13
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2021-06-15
      相关资源
      最近更新 更多