DDD: Должен ли ассемблер Dto быть частью уровня домена?

Заранее спасибо.

У меня есть несколько агрегатов в библиотеке уровня домена. Кроме того, некоторые DTO находятся в отдельной библиотеке, которая используется совместно сервером и клиентской стороной.

Агрегат объекта более информативен, чем его DTO. Итак, для преобразования из DTO в Aggregate репозиторий должен быть доступен для Dto Assembler. Интерфейсы репозиториев находятся на уровне домена. Вот почему я прихожу к выводу, что DtoAssembler должен быть частью DomainLayer.

Это правильно?


person Andrey K.    schedule 24.11.2015    source источник
comment
Спасибо за ответы. Я все еще пытаюсь собрать все воедино. Немного отредактировал свой вопрос. Я считаю, что DtoAssembler диктует, какие методы должен иметь репозиторий. И интерфейс репозитория в DL. Вот почему я начал думать о DtoAssembler как о части DL ...   -  person Andrey K.    schedule 24.11.2015
comment
Моя ошибка заключалась в том, что я хотел использовать DtoAssembler для преобразования Dto в Aggregate. Благодаря ответам я понял, что лучше всего выполнить преобразование и подать заявку в Application Services.   -  person Andrey K.    schedule 27.11.2015


Ответы (2)


Нет, это было бы неправильно в контексте DDD.

Попробуйте спросить (нетехнического) эксперта в предметной области, что он думает об ассемблере DTO. Он будет смотреть на вас большими вопрошающими глазами.

DTO (и, следовательно, их ассемблер) - это техническая концепция: они определяют структуру данных в контексте определенного интерфейса вашей системы.

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

Когда у вас есть данные из репозитория (независимо от того, является ли он агрегатом или объектом данных), вы можете передать их в ассемблер DTO.

person theDmi    schedule 25.11.2015
comment
Спасибо! DtoAssembler принимает IRepository, чтобы преобразовать Dto в агрегат, верно? Правильно ли я, что DtoAssembler должен быть умным, что он должен не только получать агрегат, но и применять к нему изменения? (Это потому, что может случиться так, что данные в Dto отличаются от данных полученного агрегата, тогда как идентификатор такой же ...) ...? - person Andrey K.; 25.11.2015
comment
Я бы сохранил DtoAssembler простым и делал бы все нетривиальные вещи в сервисе приложения. Таким образом, DtoAssembler просто принимает входные данные, необходимые для создания DTO, применяет преобразование там, где это необходимо (например, сериализацию), а затем возвращает DTO. - person theDmi; 25.11.2015
comment
Спасибо, мне нравится эта идея :), а как насчет преобразования с Dto на Aggregate наоборот? У меня, вероятно, была ошибочная идея, что DtoAssembler также должен иметь возможность преобразовывать Dto в Aggregate ... - person Andrey K.; 25.11.2015
comment
Прямое преобразование DTO в агрегат в большинстве случаев не имеет смысла. Вы уверены, что хотите использовать DDD? Это очень похоже на создание приложения в стиле CRUD. Предлагаю вам прочитать об услугах приложений DDD. Они предназначены для того, что вы пытаетесь делать в DtoAssembler. - person theDmi; 25.11.2015

На мой взгляд, это не обязательно. Поскольку вы используете многоуровневую архитектуру, я предполагаю, что ваши DTO находятся на верхнем уровне - обычно на уровне обслуживания - который действует как точка связи между сервером и клиентами. Действительно, основная цель DTO, как следует из их названия (Объекты передачи данных), состоит в том, чтобы обеспечить связь, передачу информации без какой-либо логики, например. операции.

Слои должны знать только те, которые расположены ниже, а не выше; таким образом, DTO должны храниться на уровне обслуживания и использоваться ответственным лицом - например, командным процессором - для извлечения объектов домена из репозитория и выполнения любых задействованных операций.

Итог: DTO не относятся к домену, они относятся к сервису / коммуникациям.

person jnovo    schedule 24.11.2015
comment
Спасибо! Вы привели пример командного процессора. Это заставило меня подумать, что переход Dto- ›Aggregate и Aggregate-› Dto может быть выполнен в ServiceLayer, избегая DtoAssembler. Как вы думаете, будет ли это лучше, чем наличие умного DtoAssembler, который должен не только получать агрегат, но и применять к нему изменения? (может случиться так, что данные в Dto отличаются от данных полученного Aggregate, тогда как Id будет таким же) - person Andrey K.; 25.11.2015
comment
DtoAssembler должен быть настолько тупым, насколько это возможно, обычно он просто отображает поля одного объекта в другой - например, между вашим агрегатом и вашим DTO. - person jnovo; 25.11.2015