Я сам із цим боровся. Бувають випадки, коли DTO має сенс використовувати у презентації. Скажімо, я хочу показати випадаючий список компаній у своїй системі, і мені потрібен їх ідентифікатор, для якого пов’язується значення.
Ну замість того, щоб завантажувати CompanyObject, який міг би мати посилання на підписки або хто знає що ще, я міг би надіслати DTO з іменем та ідентифікатором. Це хороше використання IMHO.
Тепер візьмемо інший приклад. У мене є об'єкт, який представляє оцінку, ця оцінка може складатись із робочої сили, обладнання тощо, вона може мати багато розрахунків, які визначає користувач, які беруть усі ці елементи та підсумовують їх (кожна оцінка може бути різною для різних типів розрахунків). Чому я повинен моделювати цей об'єкт двічі? Чому я не можу просто зробити так, щоб мій інтерфейс перелічував обчислення та відображав їх?
Як правило, я не використовую DTO для ізоляції шару домену від мого інтерфейсу. Я використовую їх, щоб ізолювати мій рівень домену від межі, яка знаходиться поза моїм контролем. Думка, що хтось міститиме навігаційну інформацію у своєму бізнес-об’єкті, смішна, не забруднюйте об’єкт вашого бізнесу.
Ідея, що хтось поставить перевірку у свій бізнес-об’єкт? Ну, я кажу, що це добре. Ваш інтерфейс користувача не повинен відповідати виключно для перевірки ваших бізнес-об'єктів. Ваш рівень бізнесу ПОВИНЕН зробити власну перевірку.
Чому б ви розміщували код генерації інтерфейсу користувача в об'єкті бізнесу? У моєму випадку у мене є окремі об'єкти, які генерують код інтерфейсу окремо від інтерфейсу. У мене є спеціальні об'єкти, які перетворюють мої бізнес-об'єкти на Xml, ідея про те, що вам потрібно розділити свої шари, щоб запобігти подібному забрудненню, для мене настільки чужа, бо навіщо вам навіть розміщувати код генерації HTML у бізнес-об'єкті ...
Редагувати
Як я думаю трохи більше, є випадки, коли інформація про інтерфейс може належати до рівня домену. І це може затьмарити те, що ви називаєте доменним рівнем, але я працював над додатком із декількома клієнтами, який мав дуже різну поведінку як зовнішнього вигляду інтерфейсу, так і функціонального робочого процесу. Залежно від різних факторів. У цьому випадку у нас була модель домену, яка представляла орендарів та їх конфігурацію. Їхня конфігурація включала інформацію про інтерфейс користувача (наприклад, мітки для загальних полів).
Якщо мені довелося проектувати свої об’єкти, щоб зробити їх стійкими, чи повинен я також дублювати об’єкти? Майте на увазі, якщо ви хочете додати нове поле, тепер у вас є два місця для його додавання. Можливо, це піднімає ще одне запитання, чи використовуєте ви DDD, чи всі об'єкти домену зберігаються? Я знаю, що на моєму прикладі вони були.