Из того, что я мог понять о концепции Aggregate Root, я подумал, что класс Order должен быть совокупным корнем для OrderLine.
Да, OrderLine, скорее всего, должен находиться в корне OrderLine, поскольку OrderLine, скорее всего, не имеет смысла вне родительского Order.
Должен ли я жестко кодировать новый оператор OrderLine() в моем классе пользовательского интерфейса/сервиса?
Вероятно, нет, хотя это часто случается, и это работает. Проблема, на мой взгляд, заключается в том, что создание объекта часто происходит в разных контекстах, и ограничения проверки различаются в зависимости от этого контекста.
Должен ли я определить метод с такими параметрами, как productID, количество и т. д., в классе Order?
As in:
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. Что было бы лучшим подходом для этого?
Это будет пример из учебника для паттерна Factory. Я добавляю такую фабрику в свои пользовательские коллекции, чтобы поддерживать создание экземпляров в этих Add()
методах.
person
quentin-starin
schedule
01.12.2010