DDD - Совокупный корень - Пример заказа и OrderLine - PullRequest
7 голосов
/ 02 декабря 2010

Я стараюсь изо всех сил изучать DDD (разрабатывая образец сайта электронной коммерции с такими объектами, как Order, OrderLines, Product, Categories и т. Д.). Исходя из того, что я мог понять о концепции Aggregate Root, я подумал, что класс Order должен быть агрегатным корнем для OrderLine.

Пока все шло хорошо, но я запутался, когда определял поток создания заказов из пользовательского интерфейса. Когда я хочу добавить строку заказа в свой объект заказа, как мне получить / создать экземпляр объекта OrderLine:

  1. Должен ли я жестко кодировать новый оператор OrderLine() в своем интерфейсе / классе обслуживания
  2. Должен ли я определить метод с параметрами, такими как productID, quantity и т. Д. В Order классе?

Кроме того, что если я захочу удалить жестко запрограммированные экземпляры из пользовательского интерфейса или класса Order, используя DI. Каков наилучший подход для этого?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Из того, что я мог понять о концепции Aggregate Root, я подумал, что класс Order должен быть корнем aggreagrte для OrderLine.

Да, OrderLine, скорее всего, должен находиться под корнем OrderLine, поскольку OrderLine'sвероятно, не имеет смысла вне родительского Order.

Должен ли я жестко закодировать новый оператор OrderLine () в моем UI / Service class

Вероятно, нет, хотя это какэто часто случается, и это заставляет работать.Проблема, на мой взгляд, состоит в том, что создание объектов часто происходит в разных контекстах, и ограничения валидации различаются в зависимости от этого контекста.

Должен ли я определять метод с параметрами, такими как productID, количество и т. Д. ВКласс заказа?

Как в:

public OrderLine AddOrderLine(Product product, int Quantity ... )

Это один из способов сделать это.Обратите внимание, что я использовал класс Product вместо ProductId.Иногда одно предпочтительнее другого.Я нахожу, что я часто использую оба по разным причинам - иногда у меня есть идентификатор, и нет веской причины для извлечения совокупного корня, иногда мне нужен другой корень для проверки операции.

Другой способ сделать этореализовать заказную коллекцию для детей.

Итак, у меня есть:

order.OrderLines.Add(product, quantity);

Это выглядит немного более естественным или ОО, и, в частности, если корень сущности имеет много дочерних коллекций, он избегает беспорядка.

order.AddOrderLine(), order.AddXXX(), order.AddYYY(), order.AddZZZ()

против

order.OrderLines.Add(), order.ZZZs.Add(), order.YYYs.Add()

Кроме того, что если я захочу удалить жестко закодированные экземпляры из пользовательского интерфейса или класса Order с помощью DI.Каков наилучший подход для этого?

Это будет учебник для примера фабрики.Я внедряю такую ​​Фабрику в свои пользовательские коллекции для поддержки создания экземпляров в этих Add() методах.

2 голосов
/ 02 декабря 2010

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

Вот отличная книга, которую вы найдете полезной для DDD .

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