使用Repository和Business对象有什么好的做法?

时间:2010-08-02 09:59:22

标签: c# object repository

我有几个业务类,如Address,Product,Order,OrderLine。在这种情况下,我有一个关于我的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方法会发生什么?

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

我在这里有点迷失,因为当所有这些内部项目(地址和OrderLines)都必须更新,插入或删除时,它会变得非常复杂。

有人有建议吗?

非常感谢您提前:))

1 个答案:

答案 0 :(得分:0)

如果您遵循Domain Driven Design学校,您可以将您的模型参与聚合,其中每个聚合将包含许多相关类,Order,OrderLine等。在每个聚合中,一个类被指定为聚合根,例如,订单,并负责管理聚合中所有对象的模型完整性。 在DDD存储库中对对象的聚合进行操作,而不是对单个对象进行操作。确切地说如何将模型参与聚合可能很困难,但一旦完成,责任就会变得清晰。