TL; DR:
DTO описує схему передачі стану. POCO нічого не описує. Це ще один спосіб сказати "об'єкт" в OOP. Він походить від POJO (Java), придуманого Мартіном Фаулером, який буквально просто описує його як більш фантазійне ім'я для "об'єкта", оскільки "об'єкт" не дуже сексуальний.
DTO - це об'єктна модель, що використовується для перенесення стану між проблемними шарами. Вони можуть мати поведінку (тобто технічно може бути поко), якщо така поведінка не мутує стан. Наприклад, у нього може бути метод, який серіалізує себе.
POCO - це звичайний об'єкт, але те, що мається на увазі під «звичайним», - це те, що він не є особливим. Це просто означає, що це об'єкт CLR, не маючи на увазі малюнок. Родовий термін. Він не створений для роботи з деякими іншими рамками. Так що якщо ваш POCO є[JsonProperty]
або прикраси EF, це його властивості, то я б стверджував, що це не POCO.
Ось декілька прикладів різних видів шаблонів об'єктів для порівняння:
- Модель перегляду : використовується для моделювання даних для подання. Зазвичай має примітки до даних для сприяння прив'язці та валідації. У MVVM він також виконує функції контролера. Це більше, ніж DTO
- Об'єкт значення : використовується для представлення значень
- Корегований корінь : використовується для управління державою та інваріантами
- Обробники : використовуються для відповіді на подію / повідомлення
- Атрибути : використовуються як прикраси для вирішення проблем, що перетинаються між собою
- Сервіс : використовується для виконання складних завдань
- Контролер : використовується для управління потоком запитів та відповідей
- Фабрика : використовується для налаштування та / або складання складних об'єктів для використання, коли конструктор недостатньо хороший. Також використовується для прийняття рішень щодо того, які об’єкти потрібно створити під час виконання.
- Сховище / DAO : використовується для доступу до даних
Це все просто об’єкти, але зауважте, що більшість із них, як правило, прив’язані до візерунка. Таким чином, ви можете назвати їх "об'єктами", або ви можете бути більш конкретними щодо його намірів і називати його таким, яким він є. Ось чому ми маємо шаблони дизайну; описати складні поняття в кількох роботах. DTO - зразок. Сукупний корінь - це шаблон, модель перегляду - це візерунок (наприклад, MVC & MVVM). POCO - це не зразок.
POCO не описує шаблону. Це просто інший спосіб посилання на класи / об'єкти в OOP. Розглядайте це як абстрактне поняття; вони можуть посилатися на що завгодно. IMO, є односторонні відносини, хоча оскільки об'єкт досягає точки, коли він може чисто виконувати лише одну мету, це вже не POCO. Наприклад, як тільки ви позначите свій клас прикрасами, щоб він працював з деякими рамками, це вже не POCO. Тому:
- DTO - POCO
- POCO не є DTO
- Модель перегляду - POCO
- POCO - це не модель перегляду
Сенс у розрізненні між ними полягає в тому, щоб чіткі та послідовні зразки дотримувалися зусиль, щоб не перетинати проблеми і не призводити до тісного зв'язку. Наприклад, якщо у вас є бізнес-об'єкт, який має методи мутації стану, але також прикрашений до пекла декораціями EF для збереження на SQL Server AND JsonProperty, щоб він міг бути відправлений назад через кінцеву точку API. Цей об'єкт буде нетерпимим до змін і, ймовірно, буде залитий варіантами властивостей (наприклад, UserId, UserPk, UserKey, UserGuid, де деякі з них позначені так, щоб їх не було збережено в БД, а інші позначені, щоб не бути серіалізованими до JSON в кінцевій точці API).
Отже, якщо ви хочете сказати мені, що це щось DTO, я, мабуть, переконався, що він ніколи не використовувався ні для чого, крім переміщення стану. Якби ви сказали мені, що це модель перегляду, я б, мабуть, переконався, що він не зберігається в базі даних. Якби ви сказали мені, що щось є Доменною моделлю, я б, певно, переконався, що він не має залежностей від будь-якого поза домену. Але якби ти сказав мені, що щось є POCO, ти насправді взагалі не дуже мені розкажеш.