Говоря концептуально, вы хотите иметь возможность повторно использовать уровень службы / приложения через уровни представления и через разные порты доступа (например, консольное приложение, взаимодействующее с вашим приложением через веб-сокет).Кроме того, вы не хотите, чтобы каждое изменение домена всплывало в слоях над прикладным уровнем.
Контроллер концептуально относится к уровню представления.Следовательно, вы не хотели бы, чтобы прикладной уровень был связан с контрактом, определенным на том же концептуальном уровне, на котором определен контроллер. Вы также не хотели бы, чтобы контроллер зависел от домена, или он может измениться, когда доменизменения.
Требуется решение, в котором контракты методов уровня приложения (параметры и тип возврата) выражаются в любых собственных типах или типах Java, определенных на границе уровня обслуживания.
Если мы примем образец IDDD от Вона Вернона, мы можем видеть, что его контракты с методами обслуживания приложений определены в собственных типах Java.Его методы команд службы приложений также не дают никакого результата, если он использовал CQRS, но мы видим, что методы запроса действительно возвращают DTO, определенный в пакете уровня приложения / службы.
В перечисленных выше 3 методах, какие из них правильные / неправильные?
Оба, # 1 и # 2, очень похожи и могут быть правильными с точки зрения зависимости, пока ItemDto
и CreateItemRequest
определены в пакете прикладного уровня, но я бы предпочел № 2, поскольку тип входных данных именуется в зависимости от варианта использования, а не просто от типа сущности, с которой он имеет дело: сущность именования-фокус лучше подходит для CRUD и из-зачто вам может быть трудно найти хорошие имена для входных типов данных других методов прецедентов, работающих на объектах того же типа.# 2 также был популяризирован через CQRS (где команды обычно отправляются на командную шину), но не является эксклюзивным для CQRS.Вон Вернон также использует этот подход в образцах IDDD .Обратите внимание, что то, что вы называете request , обычно называется command .
Однако # 3 не будет идеальным, учитывая, что он связывает контроллер (уровень представления) с доменом.
Например, некоторые методы получают 4 или 5 аргументов.По мнению Эрика Эванса из «Чистого кода», таких методов следует избегать.
Это хорошее руководство, которому нужно следовать, и я не говорю, что образцы не могут быть улучшены, но имейте в виду, что в DDDосновное внимание уделяется наименованию вещей в соответствии с Ubiquitous Language (UL) и следованию за ним как можно ближе.Следовательно, внедрение новых концепций в проект только для группировки аргументов может быть вредным.По иронии судьбы, процесс попыток сделать это может все же дать некоторые хорошие идеи и позволить обнаружить пропущенные и полезные концепции предметной области, которые могут обогатить UL.
PS: Роберт К. Мартин написал «Чистый код»не Эрик Эванс, который славится синей книгой.