Я интересно, если это так, почему сущность Framework не предлагать логику, чтобы создать новый объект с такими же свойствами для передачи данных между слоями?
Я использую объектов, которые можно создать в рамках организации.
Это до вас.
Большинство людей скажет вам, что это'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-это спорно. Некоторые люди любят смешивать субъекты и объекты переноса данных, некоторые люди Дон'т.
Чтобы ответить на ваш обновленный вопрос, эф является ОРМ. Его работа заключается в карте записей базы данных с объектами и наоборот. Что вы делаете с теми предметами, до и после прохождения через эф не является частью его проблемы. И не должно быть.
Нет, это не так.
В идеале, объекты переноса данных будет соответствовать вашему хранилищ сохраняемости (ака, таблиц базы данных).
Но ваш бизнес-классы не обязательно совпадают. Вам могут потребоваться дополнительные классы , или разделенное, или присоединился к классам, что у вас в базе. Если ваше приложение является небольшой, Вы не могли действительно увидеть такого рода проблемы, но в средних и больших приложений, это будет происходить часто.
Другое дело, что объекты переноса данных, являются частью домена независимо от того, что имеет дело с упорством, пока ваш бизнес-уровень должен знать ничего о них.
Это на самом деле очень плохая идея. Мартин Фаулер имеет статьи про местные объекты переноса данных.
Короче говоря, шаблон ДТО `был использован для передачи данных вне процесса, например по проводу, а не между слоями внутри одного процесса.
Нет, это'ы плохая практика.
Некоторые причины:
@JsonIgnore
из Java-мира), но это приводит к следующей проблеме...Таким образом, это'ы легче и безопасно использовать какой-то инструмент маппера, чтобы помочь вам на этой работе, картирование полей сущности в ДТО.
Чтобы завершить то, что @Dherik сказал, основные проблемы использования объектов в качестве объектов передачи данных :
В сделку, вы рискуете совершить изменения, сделанные на вашей сущности, поскольку вы используете его в качестве ДТО (даже если вы можете отсоединить сущности сессии в сделке, большую часть времени вы'll необходимо, чтобы проверить это состояние, прежде чем какие-либо изменения на лицо-DTO и заверить, что вы не в транзакции или что сессия была закрыта, если вы не'т хотим, чтобы изменения сохранялись).
Размер данных между клиентом и сервером: иногда вы Don'т хотите, чтобы отправить все содержимое сущности к клиенту, чтобы уменьшить размер запроса'ы ответ. Отделения ДТО сущности является более гибким, так как специализируются на данных, которые вы хотите отправить в определенных случаях использования.
Видимость и техническое обслуживание : Вы должны управлять вашей помощью JPA/спящий режим аннотации на сущности'с полей и сохранить аннотации Джексон для сериализации в JSON в то же место (даже если вы можете отделить их от объекта, осуществление сдачи их в интерфейс унаследован лицо). Затем, если вы измените свой ДТО содержание в добавлении нового поля, другой человек может, наверное, думаете, что это'ы в области лица, поэтому поля таблицы заинтересованные в вашей базе данных (даже если вы можете использовать `@переходные аннотации на всех ваших ДТО полей на случай ..!).
На мой взгляд, это создает шум, когда вы читаете сущности, но мое мнение, конечно, субъективное.