Мені цікаво, тому що якщо так, то чому Entity Framework не пропонує логіки створити новий об'єкт із тими ж властивостями для передачі даних між шарами?
Я використовую об'єкти сутності, які генерую за допомогою сутності.
Мені цікаво, тому що якщо так, то чому Entity Framework не пропонує логіки створити новий об'єкт із тими ж властивостями для передачі даних між шарами?
Я використовую об'єкти сутності, які генерую за допомогою сутності.
Відповіді:
Тобі вирішувати.
Більшість людей скажуть вам, що це не є хорошою практикою, але ви можете піти з нею в деяких випадках.
EF ніколи не грає добре з DDD з кількох причин, але виділяються дві: ви не можете мати параметризовані конструктори для ваших організацій і не можете інкапсулювати колекції. DDD покладається на це, оскільки модель домену повинна включати як дані, так і поведінку.
Певним чином, EF змушує вас мати анемічну модель домену, і в цьому випадку ви можете використовувати сутності як DTO. Якщо ви користуєтесь навігаційними властивостями, ви можете зіткнутися з деякими проблемами, але ви можете серіалізувати ці об'єкти та надіслати їх по дроту. Це може бути не практично. Вам доведеться контролювати серіалізацію для кожної сутності, яка має властивості, які вам не потрібно надсилати. Найпростіший спосіб - просто спроектувати окремі класи, призначені для передачі даних. Для цього створені бібліотеки типу AutoMapper .
Наприклад: Припустимо, у вас є клас, викликаний Person
із таким визначенням:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
Припускаючи , що ви хочете , щоб відобразити список співробітників де - то, може бути практичним , щоб відправити тільки Id
, FirstName
і LastName
. Але вам доведеться надіслати всі інші неактуальні властивості. Це не так вже й велике питання, якщо вам не байдуже розмір відповіді, але загальна ідея - надіслати лише відповідні дані. З іншого боку, ви можете розробити API, який повертає список осіб, і в цьому випадку може знадобитися надсилання всіх властивостей, таким чином має сенс серіалізувати та відправляти сутності. У цьому випадку створення класу DTO є дискусійним. Деяким подобається змішування об'єктів і DTO, деякі - ні.
Щоб відповісти на ваше оновлене запитання, EF є ORM. Його завдання полягає у зіставлянні записів бази даних на об’єкти та навпаки. Те, що ви робите з цими об'єктами до і після проходження через EF, не є частиною його занепокоєння. Не повинно бути.
Ні, це не так.
В ідеалі, DTO будуть відповідати вашим постійним сховищам (він же, таблиці вашої бази даних).
Але ваші бізнес-класи - це не обов'язково відповідність. Можливо, вам знадобляться додаткові класи, або відокремлені, або приєднані класи до того, що у вас є в базі даних. Якщо ваша програма невелика, ви, можливо, не відчуєте подібних проблем, але в середніх та великих програмах це трапляється часто.
Інша справа, що DTO є частиною домену будь-якого, що стосується наполегливості, тоді як ваш бізнес-шар не повинен нічого про них знати.
Це насправді дуже погана ідея. У Мартіна Фаулера є стаття про місцеві DTO .
Якщо коротко розповісти, DTO
шаблон використовувався для передачі даних поза процесом, наприклад, по дроту, а не між шарами всередині того самого процесу.
Ні, це погана практика.
Деякі причини:
@JsonIgnore
у світі Java), але це призводить до наступної проблеми ...get
метод сутності.Отже, простіше та безпечніше використовувати якийсь інструмент для картографування, який допоможе вам у цій роботі, зіставляючи поля об’єктів у Dto.
Для завершення того, що сказав @Dherik, основними проблемами використання об'єктів сутності як об'єктів передачі даних є:
Під час транзакції ви ризикуєте здійснити зміни, внесені до вашої організації, оскільки ви використовуєте їх як DTO (навіть якщо ви можете від'єднати об'єкт сеансу в транзакції, більшу частину часу вам потрібно буде перевірити цей стан, перш ніж будь-які зміни у вашій сутності-DTO і запевняють, що ви не здійснюєте транзакцію або що сеанс був закритий, якщо ви не хочете, щоб зміни зберігалися).
Розмір даних, якими ви обмінюєтесь між клієнтом та сервером: іноді ви не хочете надсилати клієнту весь вміст об'єкта, щоб мінімізувати розмір відповіді на запит. Відокремлення DTO від сутності є більш гнучким, щоб спеціалізувати дані, які ви хочете надіслати у певних випадках використання.
Видимість та обслуговування: Ви повинні керувати своїми анотаціями jpa / hibernate на полях вашої особи та підтримувати анотації Джексона, щоб серіалізуватись у json на тому самому місці (навіть якщо ви можете відокремити їх від реалізації сутності, поставивши їх у інтерфейс, успадкований суб'єкт). Потім, якщо ви зміните вміст DTO, додаючи нове поле, інша людина, ймовірно, може подумати, що це поле сутності, тому поле відповідної таблиці у вашій базі даних (навіть якщо ви можете використовувати @Transient
анотацію на всіх своїх полях DTO. для справи ..!).
На мою думку, він створює шум, коли читаєш сутність, але моя думка, безумовно, суб’єктивна.