Из того, что я мог понять о концепции 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()
методах.