Я (пере) проектую масштабне додаток, ми використовуємо багатошарову архітектуру на основі DDD.
У нас є MVC з рівнем даних (реалізація сховищ), доменним рівнем (визначення доменної моделі та інтерфейсів - сховища, служби, блок роботи), сервісний рівень (реалізація послуг). Поки ми використовуємо доменні моделі (в основному сутності) на всіх шарах, і ми використовуємо DTO лише як моделі перегляду (в контролері, сервісі повертаються доменні моделі (і), а контролер створює модель перегляду, яка передається в представлення).
Я прочитав незліченну кількість статей про використання, не використання, відображення та проходження DTO. Я розумію, що остаточної відповіді немає, але я не впевнений, це нормально чи не повертає доменні моделі з сервісів до контролерів. Якщо я поверну модель домену, вона все ще ніколи не передається перегляду, оскільки контролер завжди створює модель перегляду, орієнтовану на перегляд - у цьому випадку це здається законним. З іншого боку, це не вірно, коли модель домену залишає бізнес-рівень (сервісний рівень). Іноді сервісу потрібно повернути об’єкт даних, який не був визначений у домені, і тоді нам або потрібно додати новий об’єкт до домену, який не відображається, або створити об’єкт POCO (це некрасиво, оскільки деякі служби повертають моделі домену, деякі ефективно повернути DTO).
Питання полягає в тому, що - якщо ми суворо користуємося переглядаючими моделями, чи нормально повертати доменні моделі аж до контролерів, чи завжди ми повинні використовувати DTO для спілкування з рівнем обслуговування? Якщо так, то чи добре налаштовувати доменні моделі на основі того, які послуги потрібні? (Чесно кажучи, я не вважаю це так, оскільки служби повинні споживати те, що має домен.) Якщо ми повинні чітко дотримуватися DTO, чи повинні вони визначатися в рівні обслуговування? (Я думаю, що так.) Іноді зрозуміло, що ми повинні використовувати DTO (наприклад, коли сервіс виконує багато ділової логіки та створює нові об'єкти), іноді зрозуміло, що ми повинні використовувати тільки доменні моделі (наприклад, коли служба Членство повертає анемічного користувача ( s) - мабуть, не було б особливого сенсу створювати DTO, який є таким же, як доменна модель) - але я віддаю перевагу послідовності та належній практиці.
Article Domain vs DTO vs ViewModel - Як і коли ними користуватися? (а також деякі інші статті) дуже схожа на мою проблему, але це не відповідає на це питання. Стаття Чи слід реалізувати DTO в шаблоні сховищ з EF? також подібний, але він не має відношення до DDD.
Відмова: Я не збираюся використовувати будь-яку схему дизайну лише тому, що вона існує і є вигадливою, з іншого боку, я хотів би використовувати хороші дизайнерські шаблони та практики також тому, що це допомагає проектувати додаток в цілому, допомагає розділити Побоювання, навіть для того, щоб використовувати певний зразок, "не потрібно", принаймні на даний момент.
Як завжди, дякую.