Что такое хорошая практика с репозиторием и бизнес-объектами? - PullRequest
0 голосов
/ 02 августа 2010

У меня есть несколько бизнес-классов, таких как Address, Product, Order, OrderLine.В этом случае у меня есть вопрос, касающийся моего класса Order и способа его обновления в хранилище.

Класс Order может иметь более 1 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();

, который внутренне вызывает метод Update репозитория Orders, например:

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.

Что должно произойти в методе обновления репозитория заказов?

Следует ли обновить весь заказ, включая все строки заказа, удалить удаленную строку заказа, сохранитьСтрока заказа, которая была добавлена, и обновить строку заказа, которая была изменена?

Я немного растерялся, потому что это становится очень сложным, когда все эти внутренние элементы (Address и OrderLines) должны быть обновлены, вставлены или удалены.

У кого-нибудь есть предложения?

Заранее большое спасибо:)

1 Ответ

0 голосов
/ 02 августа 2010

Если вы следуете школе, управляемой доменом, хотя бы, вы бы включили свою модель в агрегаты, где каждый агрегат будет состоять из ряда связанных классов, Order, OrderLine и так далее. Внутри каждого агрегата один класс обозначается как корень агрегата, например Заказ и берет на себя ответственность за управление целостностью модели всех объектов в совокупности. В репозиториях DDD работают с агрегатами объектов, а не с отдельными объектами. Точно, как включить модель в агрегаты, может быть сложно, но как только вы это сделаете, ответственность станет ясной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...