После долгих чтений и размышлений, когда я начинаю заворачивать голову вокруг DDD, я немного смущен о лучших методах работы со сложными иерархиями под агрегированным корнем. Я думаю, что это FAQ, но после чтения бесчисленных примеров и обсуждений никто не говорит о проблеме, которую я вижу.
Если я согласен с мышлением DDD, сущности ниже совокупного корня должны быть неизменными. Это суть моей проблемы, поэтому, если это неверно, вот почему я потерян.
Вот сфабрикованный пример... надеюсь, что у него достаточно воды для обсуждения.
Рассмотрим страховой полис автомобиля (я не в страховании, но это соответствует языку, который я слышу, когда на телефоне с моей страховой компанией).
Политика - это, очевидно, субъект. В рамках политики, допустим, у нас есть Авто. Авто, ради этого примера, существует только в пределах политики (возможно, вы могли бы перенести Auto на другую политику, так что это также возможно для агрегата, что изменяет Политику... но предположим, что это проще, чем сейчас), Поскольку Auto не может существовать без Политики, я думаю, что это должен быть Entity, но не корень. Таким образом, политика в этом случае является совокупным корнем.
Теперь, чтобы создать Политику, предположим, что она должна иметь как минимум один авто. Здесь я расстраиваюсь. Предположим, что Auto довольно сложный, в том числе много полей и, возможно, ребенок, где он находится в гараже (местоположение). Если я правильно понял, конструктор "create Policy" /factory должен был бы принимать в качестве входного параметра Auto или быть ограниченным через построитель, который не будет создан без этого Авто. И автосоздание, поскольку оно является сущностью, не может быть сделано заранее (потому что оно неизменное, может быть, это просто некорректная интерпретация). Таким образом, вы не можете сказать новый Auto, а затем setX, setY, add (Z).
Если Auto более чем несколько тривиально, вы должны создать огромную иерархию строителей и попытаться управлять созданием Auto в контексте Политики.
Еще один поворот к этому - позже, после создания Политики, и вы хотите добавить еще один Авто... или обновить существующий Авто. Ясно, что политика контролирует это... отлично... но Policy.addAuto() не будет летать, потому что нельзя просто перейти в новый Auto (правый!?). Например, такие вещи, как Policy.addAuto(VIN, make, model и т.д.), Но все так просто, что это выглядит разумно. Но если этот метод метода factory разваливается со слишком большим количеством параметров (возможно, весь автоматический интерфейс), мне нужно решение.
С этой точки зрения, я понимаю, что наличие временной ссылки на объект в порядке. Итак, может быть, прекрасно иметь объект, созданный за пределами его родительского элемента в совокупности в переходной среде, поэтому, возможно, это нормально сказать что-то вроде:
auto = AutoFactory.createAuto(); auto.setX auto.setY
или, если придерживаться неизменяемости, AutoBuilder.new(). setX(). setY(). build()
а затем выясните, когда вы произнесите команду Policy.addAuto(auto)
Этот пример страхования становится более интересным, если вы добавляете события, такие как авария с ее политиками или RepairEstimates... некоторые объекты значений, но большинство сущностей, которые все действительно бессмысленны вне политики... по крайней мере, для моего простого примера.
Жизненный цикл политики с ее растущей иерархией с течением времени представляет собой фундаментальную картину, которую я должен сделать, прежде чем действительно начать копаться... и это больше концепция factory или то, как дочерние сущности получают/присоединяются к совокупности что я не видел убедительного примера.
Я думаю, что я рядом. Надеюсь, что это ясно, а не просто повторение часто задаваемых вопросов, которые имеют ответы повсюду.