Я (пере) проектирую крупномасштабное приложение, мы используем многоуровневую архитектуру на основе DDD.
У нас есть MVC с уровнем данных (реализация репозиториев), доменом (определение модели домена и интерфейсов - репозитории, сервисы, единица работы), сервисным уровнем (реализация сервисов). До сих пор мы использовали доменные модели (в основном сущности) для всех уровней и использовали DTO только в качестве моделей представлений (в контроллере служба возвращает модель (ы) домена, а контроллер создает модель представления, которая передается представлению).
Я читал бесчисленные статьи об использовании, не использовании, отображении и передаче DTO. Я понимаю, что нет однозначного ответа, но я не уверен, нормально ли это, или не возвращает модели доменов из сервисов в контроллеры. Если я возвращаю модель предметной области, она все равно никогда не передается в представление, поскольку контроллер всегда создает модель представления, зависящую от вида, - в этом случае это кажется допустимым. С другой стороны, он не чувствует себя хорошо, когда доменная модель покидает бизнес-уровень (сервисный уровень). Иногда службе необходимо вернуть объект данных, который не был определен в домене, и тогда нам нужно либо добавить новый объект в домен, который не отображается, либо создать объект POCO (это ужасно, поскольку некоторые службы возвращают модели домена, некоторые эффективно вернуть DTOs).
Вопрос заключается в том, что если мы строго используем модели представлений, можно ли возвращать модели доменов вплоть до контроллеров, или мы всегда должны использовать DTO для связи с уровнем обслуживания? Если да, то можно ли корректировать доменные модели в зависимости от того, какие услуги нужны? (Честно говоря, я так не думаю, поскольку сервисы должны потреблять то, что имеет домен.) Если мы должны строго придерживаться DTO, должны ли они быть определены на уровне сервисов? (Я так думаю.) Иногда ясно, что мы должны использовать DTO (например, когда служба выполняет много бизнес-логики и создает новые объекты), иногда ясно, что мы должны использовать только модели домена (например, когда служба членства возвращает анемичного пользователя ( s) - кажется, не имеет смысла создавать DTO, аналогичный модели предметной области), - но я предпочитаю последовательность и хорошие практики.
Статья Домен против DTO против ViewModel - Как и когда их использовать? (а также некоторые другие статьи) очень похожа на мою проблему, но не отвечает на этот вопрос (ы). Статья Должен ли я реализовать DTO в репозитории с EF? также похож, но это не касается DDD.
Отказ от ответственности: я не собираюсь использовать какой-либо шаблон проектирования только потому, что он существует и причудливый, с другой стороны, я хотел бы использовать хорошие шаблоны проектирования и практики также потому, что это помогает проектировать приложение в целом, помогает с разделением проблем, даже если использование определенного шаблона не является «необходимым», по крайней мере, на данный момент.
Как всегда, спасибо.