Мне интересно, потому что, если это так, почему Entity Framework не предлагает логику для создания нового объекта с такими же свойствами для передачи данных между слоями?
Я использую объекты сущностей, которые я генерирую с помощью структуры сущностей.
Ответы:
Это тебе решать.
Большинство людей скажут вам, что это не очень хорошая практика, но в некоторых случаях вы можете сойти с рук.
EF никогда не играл хорошо с DDD по нескольким причинам, но выделяются две: у вас не может быть параметризованных конструкторов на ваших сущностях, и вы не можете инкапсулировать коллекции. DDD полагается на это, поскольку модель предметной области должна включать как данные, так и поведение.
В некотором смысле, EF вынуждает вас иметь анемичную модель предметной области, и в этом случае вы можете использовать сущности в качестве DTO. Вы можете столкнуться с некоторыми проблемами, если используете свойства навигации, но можете сериализовать эти объекты и отправить их по проводам. Это может быть не практично, хотя. Вам придется контролировать сериализацию для каждой сущности, свойства которой вам не нужно отправлять. Более простой способ - просто разработать отдельные классы, специально предназначенные для передачи данных. Библиотеки, такие как AutoMapper , созданы для этой цели.
Например: предположим, у вас есть класс, вызываемый
Person
со следующим определением:Предполагая, что вы хотите отобразить список сотрудников где-то, может быть целесообразно отправить только
Id
,FirstName
иLastName
. Но вам придется отправить все остальные не относящиеся к делу свойства. Это не такая уж большая проблема, если вам не важен размер ответа, но общая идея - отправлять только соответствующие данные. С другой стороны, вы можете разработать API, который возвращает список людей, и в этом случае может потребоваться отправка всех свойств, что имеет смысл сериализовать и отправлять сущности. В этом случае создание класса DTO является дискуссионным. Некоторые люди любят смешивать сущности и DTO, некоторые нет.Чтобы ответить на ваш обновленный вопрос, EF - ORM. Его работа заключается в сопоставлении записей базы данных с объектами и наоборот. То, что вы делаете с этими объектами до и после прохождения EF, не является частью его забот. И не должно быть.
источник
As of EF Core 2.1, only services known by EF Core can be injected. Support for injecting application services is being considered for a future release.
мне очень нравится внедрять сервисы приложений в мои сущности.Нет.
В идеале DTO будут соответствовать вашим постоянным репозиториям (или таблицам вашей базы данных).
Но ваши бизнес-классы не обязательно совпадают. Вам могут понадобиться дополнительные классы, или отдельные, или присоединенные классы к тому, что у вас есть в базе данных. Если ваше приложение маленькое, вы, возможно, не увидите такого рода проблем, но в средних и больших приложениях это будет происходить часто.
Другое дело, что DTO являются частью того, что имеет дело с постоянством, в то время как ваш бизнес-уровень не должен ничего о них знать.
источник
Это на самом деле очень плохая идея. У Мартина Фаулера есть статья о местных DTO .
Короче говоря,
DTO
Pattern использовался для передачи данных вне процесса, например, по проводам, а не между слоями внутри одного и того же процесса.источник
Нет, это плохая практика.
Несколько причин:
@JsonIgnore
из мира Java), но это приводит к следующей проблеме ...get
метод сущности.Таким образом, проще и безопаснее использовать какой-либо инструмент картографирования, чтобы помочь вам в этой работе, сопоставляя поля сущностей с Dto.
источник
Чтобы завершить то, что сказал @Dherik, основными проблемами использования объектов сущностей в качестве объектов передачи данных являются:
В транзакции вы рискуете зафиксировать изменения, сделанные в вашей сущности, потому что вы используете ее в качестве DTO (даже если вы можете отсоединить сущность сеанса в транзакции, большую часть времени вам нужно будет проверить это состояние до того, как любые изменения в вашей сущности-DTO и убедитесь, что вы не участвуете в транзакции или что сеанс был закрыт, если вы не хотите, чтобы изменения были сохранены).
Размер данных, которыми вы делитесь между клиентом и сервером: иногда вы не хотите отправлять все содержимое объекта клиенту, чтобы минимизировать размер ответа на запрос. Отделение DTO от объекта является более гибким, чтобы специализировать данные, которые вы хотите отправить в определенных случаях использования.
Видимость и обслуживание. Вы должны управлять своими аннотациями jpa / hibernate на полях вашей сущности и поддерживать аннотации jackson для сериализации в json в одном месте (даже если вы можете отделить их от реализации сущности, поместив их в интерфейс, унаследованный организация). Затем, если вы измените свой контент DTO при добавлении нового поля, другой человек, вероятно, может подумать, что это поле сущности, следовательно, поле соответствующей таблицы в вашей базе данных (даже если вы можете использовать
@Transient
аннотацию для всех ваших полей DTO для дела ..!).На мой взгляд, это создает шум, когда вы читаете сущность, но мое мнение, безусловно, субъективно.
источник