Это хорошая практика, чтобы использовать объекты как объекты передачи данных?

Я интересно, если это так, почему сущность Framework не предлагать логику, чтобы создать новый объект с такими же свойствами для передачи данных между слоями?

Я использую объектов, которые можно создать в рамках организации.

Комментарии к вопросу (3)

Это до вас.

Большинство людей скажет вам, что это's не хорошая практика, но вы можете уйти с ним в некоторых случаях.

Эф никогда не играл хорошо с ДДД по нескольким причинам, но две: вы можете'т иметь параметризованные конструкторы на вашем организме, и вы можете'т содержат наборы. ДДД основывается на том, что, поскольку модель предметной области должна включать как данные, так и поведение.

Таким образом, эф сил вам иметь анемичная модель предметной области и в этом случае вы можете использовать объекты как объекты переноса данных. Вы можете столкнуться с некоторыми проблемами, если вы используете свойства навигации, но вы можете сериализовать эти субъекты и отправить их по проводам. Это не может быть практическим, хотя. Вам придется контролировать сериализацию для каждого объекта, который имеет свойства, которые вы Дон'т должны прислать. Более простой способ-это просто дизайн отдельных классах, адаптированных для передачи данных. Библиотеки, такие как AutoMapper создаются для этой цели.

Например: Предположим, у вас есть класс с именем "человек" со следующим определением:

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
}

Если вы хотите, чтобы отобразить список сотрудников, где-то, это может быть практично, чтобы отправить только ИД, имя и фамилия. Но вы'придется отправить всех ненужных свойств. Это's не такая большая проблема, если вы Don'т заботятся о размере ответа, но общая идея, чтобы отправить только соответствующие данные. С другой стороны, можно создать API, который возвращает список лиц, и в этом случае посылка все свойства могут быть нужны, тем самым делая смысл сериализовать и отправить лиц. В этом случае создание класса DTO-это спорно. Некоторые люди любят смешивать субъекты и объекты переноса данных, некоторые люди Дон'т.

Чтобы ответить на ваш обновленный вопрос, эф является ОРМ. Его работа заключается в карте записей базы данных с объектами и наоборот. Что вы делаете с теми предметами, до и после прохождения через эф не является частью его проблемы. И не должно быть.

Комментарии (18)

Нет, это не так.

В идеале, объекты переноса данных будет соответствовать вашему хранилищ сохраняемости (ака, таблиц базы данных).

Но ваш бизнес-классы не обязательно совпадают. Вам могут потребоваться дополнительные классы , или разделенное, или присоединился к классам, что у вас в базе. Если ваше приложение является небольшой, Вы не могли действительно увидеть такого рода проблемы, но в средних и больших приложений, это будет происходить часто.

Другое дело, что объекты переноса данных, являются частью домена независимо от того, что имеет дело с упорством, пока ваш бизнес-уровень должен знать ничего о них.

Комментарии (4)

Это на самом деле очень плохая идея. Мартин Фаулер имеет статьи про местные объекты переноса данных.

Короче говоря, шаблон ДТО `был использован для передачи данных вне процесса, например по проводу, а не между слоями внутри одного процесса.

Комментарии (1)

Нет, это'ы плохая практика.

Некоторые причины:

  1. Новую сущность поля будут в ДТО по умолчанию. Использование объекта означает, что каждая информация будет доступна для использования по умолчанию. Это может привести к разоблачению толковой информации или, по крайней мере, делает ваш контракт API надутый, с большим количеством информации, которая не используется для тех, кто потребляет этот API. Конечно, вы можете игнорировать поля с помощью некоторых Примечаний (например, @JsonIgnore из Java-мира), но это приводит к следующей проблеме...
  2. Много аннотаций/условия/Управление по сущности. Вы должны контролировать то, что вы хотели бы отправить на ДТО, когда какое-либо имя атрибута изменилось (это нарушит договор), добавить несколько атрибутов, которые не от юридического лица, порядок атрибутов и т. д. Скоро вы увидите свое простое лицо с большим количеством Примечаний, дополнительных полей и каждый раз будет труднее понять, что'ы происходит.
  3. Меньшая гибкость. С ДТО вы вольны разбить информацию на несколько классов, изменить имена атрибутов, добавлять новые атрибуты, и т. д. Вы можете'т сделать это так легко с лица, как ДТО.
  4. Не оптимизированы. Ваше лицо будет всегда больше, чем просто ДТО. Так что вы всегда будете иметь больше информации, чтобы быть проигнорированы/сериализовать и, вероятно, больше ненужной информации передается.
  5. Ленивый проблем. Используя сущности некоторых фреймворков (спящий режим), если вы попытаетесь извлечь определенную информацию, что не поленился загружены в базу данных транзакций и прежде, ОРМ прокси не будет, прикрепленный к проводке и вы получите какое-то на "ленивый исключением" просто называть "получить" метод объекта.

Таким образом, это'ы легче и безопасно использовать какой-то инструмент маппера, чтобы помочь вам на этой работе, картирование полей сущности в ДТО.

Комментарии (0)

Чтобы завершить то, что @Dherik сказал, основные проблемы использования объектов в качестве объектов передачи данных :

  1. В сделку, вы рискуете совершить изменения, сделанные на вашей сущности, поскольку вы используете его в качестве ДТО (даже если вы можете отсоединить сущности сессии в сделке, большую часть времени вы'll необходимо, чтобы проверить это состояние, прежде чем какие-либо изменения на лицо-DTO и заверить, что вы не в транзакции или что сессия была закрыта, если вы не'т хотим, чтобы изменения сохранялись).

  2. Размер данных между клиентом и сервером: иногда вы Don'т хотите, чтобы отправить все содержимое сущности к клиенту, чтобы уменьшить размер запроса'ы ответ. Отделения ДТО сущности является более гибким, так как специализируются на данных, которые вы хотите отправить в определенных случаях использования.

  3. Видимость и техническое обслуживание : Вы должны управлять вашей помощью JPA/спящий режим аннотации на сущности'с полей и сохранить аннотации Джексон для сериализации в JSON в то же место (даже если вы можете отделить их от объекта, осуществление сдачи их в интерфейс унаследован лицо). Затем, если вы измените свой ДТО содержание в добавлении нового поля, другой человек может, наверное, думаете, что это'ы в области лица, поэтому поля таблицы заинтересованные в вашей базе данных (даже если вы можете использовать `@переходные аннотации на всех ваших ДТО полей на случай ..!).

На мой взгляд, это создает шум, когда вы читаете сущности, но мое мнение, конечно, субъективное.

Комментарии (0)