У чому різниця між об’єктом моделі MVC, об’єктом домену та DTO


77

У чому різниця між об’єктом моделі MVC, об’єктом домену та DTO?

Я розумію:

Об'єкт моделі MVC:

Моделює дані, що відображаються у відповідному поданні. Він може не відображати безпосередньо об'єкт домену, тобто може включати дані одного або декількох об'єктів домену.

  1. Сторона клієнта
  2. Може містити бізнес-логіку. Напр. перевірки, обчислені властивості тощо
  3. Немає методів, пов'язаних із наполегливістю

Об'єкт домену:

Об'єкт, який моделює реальний об'єкт у проблемній області, наприклад, "Бронювання", "Клієнт", "Замовлення" тощо. Використовується для збереження даних.

  1. Сторона сервера
  2. Ніякої ділової логіки

DTO (об'єкт передачі даних):

Об'єкт, що використовується для передачі даних між шарами, коли шари перебувають в окремих процесах, наприклад, з БД в клієнтську програму. Дозволяє одну транзакцію по дроту, а не кілька викликів під час отримання даних, що відповідають декільком об’єктам домену. DTO містить лише дані та методи доступу, і логіка відсутня. Дані призначені для певної транзакції БД, тому вони можуть безпосередньо або не можуть безпосередньо зіставлятися з об’єктом домену, оскільки можуть включати дані з одного або декількох об’єктів домену.

  1. Використовується як на сервері, так і на стороні клієнта, оскільки передається між шарами
  2. Ніякої ділової логіки
  3. Немає методів, пов'язаних із наполегливістю

Отже, питання:

  1. Чи правильне розуміння вище? Мені не вистачає деяких ключових моментів?

  2. Чи є причини не використовувати об'єкти домену як модель MVC, припускаючи, що об'єкти моделі не потребують додаткової ділової логіки?

  3. Чи є причини не використовувати DTO як модель MVC, припускаючи, що об’єкти Model не потребують додаткової бізнес-логіки?


9
гарне запитання .. +1
nawfal

Відповіді:


23

Об'єкти домену та моделі по суті однакові і можуть містити бізнес-логіку. Залежно від реалізації, об'єкти домену та DTO можуть бути еквівалентними, якщо видалити бізнес-логіку з моделі у клас обслуговування.

Часто ключовим варіантом DTO є модель перегляду, яка використовується виключно для передачі даних між моделлю домену та видом, хоча часто модель перегляду може містити логіку, хоча це повинна бути суто логіка інтерфейсу користувача.


Дякую обом респондентам. Зараз це мені здається більш зрозумілим. Об'єкти домену можуть мати ділову логіку, таку як перевірка, логіка, безпосередньо пов'язана з даними.
Тімоті Моулем,

2
Окремий об'єкт моделі MVC необхідний лише для інкапсуляції логіки, пов'язаної з відображенням даних у поданні. Якщо такого немає, простіше використовувати об’єкт домену як об’єкт моделі MVC.
Тімоті Моулем,

9

Домен і DTO також можуть бути вашими "модельними" об'єктами - у вас може бути подання деталей об'єкта домену "Клієнт".

Об’єкт домену може мати бізнес-логіку для забезпечення властивостей сутності домену. валідація - один із таких випадків. Об'єкт домену сам по собі не містить методів, пов'язаних із стійкістю, але він може мати метадані (наприклад, анотації) для підтримки стійкості

модель програмування POJO дозволяє використовувати той самий об'єкт, що і ваш домен, DTO та об'єкти моделі - по суті, у вас не буде застосовано сторонніх інтерфейсів, які стосуватимуться лише одного шару, але не стосуватимуться інших.


1
Так, це те, що я роблю. Дійсно, майже в кожному випадку у мене ніколи не було потреби використовувати щось, крім об'єкта Домен. DTO буде для складного запиту з кількома елементами даних, що охоплюють об'єкти домену.
Тімоті Моулем,

1
А окремий клас моделі MVC дійсно необхідний лише у тому випадку, коли для відображення даних моделі пов’язана значна бізнес-логіка / обробка?
Тімоті Моулем,

1
так, це буде однією з причин мати належну виділену модель на відміну від використання об’єкта домену. Можливо, об’єкт вашого домену зберігає дату лише UTC, і цього достатньо для всієї вашої бізнес-логіки. Але на UI, скажімо, вам доведеться відображати його в часовому поясі облікового запису користувача. Модель буде корисною для виконання конкретних обчислень інтерфейсу користувача.
kartheek

5
A DTO = is an object that carries data between processes.

Але найцікавіше те, що він не має жодної поведінки, крім зберігання та отримання власних даних !!!

Дотримуючись методології MVC ...

Domain = subject of your entire application.

Model = contains the (programming languages objects : EX: C# objects) to make up the universe of your application.

Вони можуть очевидно мати поведінку та властивості (див. Різницю з DTO).

Часто програма (легка) може мати одну модель - випадок, коли ваша модель є саме вашим доменом. Іншою може бути модель, зовсім іншого типу об’єкта, яка обробляє іншу. Обидва вони, в даному випадку, є частиною вашого домену і називаються "моделями доменів - об'єктами".

Сподіваємось, ця відповідь вичерпна і робить це для вас зрозумілим!


3

Моє недооцінювання (у великому стислі) таке:

(MVC) Об’єкт моделі:

  • представляти деякі речі в якомусь контексті використання, наприклад. PersonEditModel, PersonViewModelабо простоPersonModel
  • не має бізнес-логіки
  • може бути предметом якоїсь логіки валдації тощо.
  • використовується для надання даних від одного рівня додатків до іншого, наприклад. Контролер MVC <-> Перегляд MVC

Об'єкт домену:

  • представляє якийсь бізнес-об'єкт (об'єкт реального світу в проблемному домені)
  • має ділову логіку
  • не допускає недійсного стану об’єкта, має методи правильної зміни стану об’єкта
  • використовується для інкапсуляції пов’язаної з ним ділової логіки
  • не повинні використовуватися для збереження даних (або навіть не повинні)

DTO (об'єкт передачі даних):

  • схожий на об’єкт Model, але повинен мати плоску структуру
  • лише властивості / поля простого типу (рядки, числа, дати, булеві значення)
  • використовується для передачі даних через межі додатків, наприклад. між веб-сервером та веб-браузером

бездоганна відповідь!
Gaurav

2

Будь-яке визначення для більшості об’єктів різне залежно від місця використання об’єктів:

Model: є загальним визначенням для використання об'єкта в клієнті або на сервері .

  1. Model View: є об'єктом, що використовує вclient більшу частину часу.
  2. Domain Object : це об'єктом, що використовує в serverтаtransfering data to the database .
  3. Data Transfer Object(DTO): це об’єкт, який передає дані з одного об’єкта на інший об’єкт , особливо при отриманні даних API Call(наприклад: в api GET Метод виклику для отримання даних ви не повинні передавати клієнтам моделі баз даних, для цього ви використовуєте dto).

Зверніть увагу: the definitions are true most of the timeале в деяких ситуаціях це не практично.


1

1) Ні, це визначення ViewModel. Об'єкт моделі MVC та об'єкт домену однакові.
2) Моделі доменів (Об’єкти) завжди присутні, ділова логіка необов’язкова
3) Якщо в Об’єкті домену немає бізнес-логіки, тоді вона автоматично стає DTO.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.