DDD - какой слой DTO должен быть реализован

Я склоняюсь к DDD, поэтому извиняюсь, если мой вопрос наивен. Я думаю, мне нужно использовать локальный объект передачи данных, чтобы отображать данные для пользователей, так как многие свойства не являются частью какого-либо объекта Entity/Value.

Однако я не уверен, где должен реализоваться этот DTO - на уровне домена или на уровне службы приложений. Реализация DTO кажется частью Домена, но это означает, что когда я создаю коллекцию DTO на Уровне обслуживания и передаю ее на уровень представления, мне приходится ссылаться на уровень домена на уровне презентации, что кажется неправильным.

Каков правильный способ реализации DTO с использованием принципов DDD?

Ответ 1

Разместите его на уровне доменных служб. DTO - это выход этого слоя, имеет смысл, если вы определите его там.

Не помещайте свое DTO на уровень домена. Слой домена не заботится о вещах вне его слоя.

ОБНОВЛЕНИЕ: уровень службы домена обычно известен как уровень "службы приложений"

Ответ 2

Йорро прав, где разместить DTO, но я призываю вас избегать "мышления DTO". Этот способ мышления сталкивается с мышлением DDD.

Мысль о "Мне нужна DTO здесь" думает о техническом представлении (как говорит plalx); это уровень абстракции слишком низкий. Попробуйте более высокий уровень абстракции и подумайте о своем домене, задачах пользователя и пользовательском интерфейсе.

Вам нужно получить данные о просмотре для пользователя? Подключите его к пользовательскому интерфейсу через службу просмотра, которая возвращает определенный класс YourViewInfo.

Вам нужно отправить данные в какую-либо службу для выполнения задачи? Отправьте ему конкретный класс TaskMessageInfo или определенный класс команд.

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

Мышление таким образом помогает моделировать систему и не вызывает таких вопросов, как

Где поставить эту вещь?

Ответ 3

DTO и Domain - это разные слои.
Поэтому требуется сопоставление одного с другим, и обычно это делается на так называемом уровне служб приложений.
Взгляните на следующие статьи, чтобы углубиться в DTO и многоуровневую структуру: