Что такое объект передачи данных?
В MVC есть классы моделей DTO, а если нет, то какие различия и нужны ли нам оба?
Что такое объект передачи данных?
В MVC есть классы моделей DTO, а если нет, то какие различия и нужны ли нам оба?
Объект передачи данных - это объект, который используется для инкапсуляции данных и отправки его из одной подсистемы приложения в другую.
DTO чаще всего используются уровнем Services в приложении N-Tier для передачи данных между собой и уровнем пользовательского интерфейса. Основное преимущество здесь заключается в том, что он уменьшает объем данных, которые необходимо отправлять по кабелю в распределенных приложениях. Они также создают отличные модели в шаблоне MVC.
Другим вариантом использования DTO может быть инкапсуляция параметров для вызовов методов. Это может быть полезно, если метод принимает более 4 или 5 параметров.
При использовании шаблона DTO вы также можете использовать ассемблеры DTO. Ассемблеры используются для создания DTO из объектов домена и наоборот.
Преобразование из объекта домена в DTO и обратно может быть дорогостоящим процессом. Если вы не создаете распределенное приложение, вы, вероятно, не увидите никаких больших преимуществ от шаблона, поскольку объясняет здесь Мартин Фоулер
Определение DTO можно найти на сайте Мартина Фаулера. DTO используются для передачи параметров методам и типам возврата. Многие люди используют их в пользовательском интерфейсе, а другие расширяют объекты домена от них.
A DTO - немой объект - он просто хранит свойства и имеет геттеры и сеттеры, но никакой другой логики какого-либо значения (кроме реализации сравнения() или equals()).
Обычно классы моделей в MVC (предполагая здесь .net MVC) являются DTO или коллекции/агрегаты DTOs
Обычно Объекты Value должны быть неизменными. Как объекты Integer или String в Java. Мы можем использовать их для передачи данных между слоями программного обеспечения. Если программные уровни или службы работают на разных удаленных узлах, например, в среде микросервисов или в устаревшем приложении Java Enterprise. Мы должны сделать почти точные копии двух классов. Это то, где мы встретили DTO.
|-----------| |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------| |--------------|
В устаревших системах Java Enterprise Systems DTO могут иметь в себе различные материалы EJB.
Я не знаю, что это лучшая практика или нет, но я лично использую Объекты Value в моих проектах Spring MVC/Boot, таких как:
|------------| |------------------| |------------|
-> Form | | -> Form | | -> Entity | |
| Controller | | Service / Facade | | Repository |
<- View | | <- View | | <- Entity / Projection View | |
|------------| |------------------| |------------|
Уровень контроллера не знает, что такое сущности. Он связывается с Формой и Просмотр объектов значения. Объекты формы имеют аннотации проверки JSR 303 (например, @NotNull) и Объекты представления значений имеют аннотации Jackson для пользовательской сериализации. (например, @JsonIgnore)
Уровень сервиса связывается с уровнем репозитория с использованием объектов Entity Objects. Объектные объекты имеют JPA/Hibernate/ Spring аннотации данных на нем. Каждый слой взаимодействует только с нижним уровнем. Межслойная связь запрещена из-за циклической/циклической зависимости.
User Service ----> XX CANNOT CALL XX ----> Order Service
Некоторые ORM Frameworks имеют возможность проекции с использованием дополнительных интерфейсов или классов. Таким образом, репозитории могут напрямую возвращать объекты View. Там вам не нужна дополнительная трансформация.
Например, это наш пользовательский объект:
@Entity
public final class User {
private String id;
private String firstname;
private String lastname;
private String phone;
private String fax;
private String address;
// Accessors ...
}
Но вы должны вернуть Paginated список пользователей, которые включают только id, firstname, lastname. Затем вы можете создать объект View Value для проекции ORM.
public final class UserListItemView {
private String id;
private String firstname;
private String lastname;
// Accessors ...
}
Вы можете легко получить разбитый на страницу результат с уровня репозитория. Благодаря Spring вы также можете использовать только интерфейсы для проекций.
List<UserListItemView> find(Pageable pageable);
Не волнуйтесь за другие операции преобразования. BeanUtils.copy
метод работает нормально.
GET
/POST
/что угодно) откуда-либо, или используете веб-сервис с использованием SOA и т.д.), Вы не хотите передавать объект большого размера с кодом, который не является необходим для конечной точки, будет потреблять данные и замедлять передачу.С помощью объектов передачи данных MVC часто используются для сопоставления моделей домена с более простыми объектами, которые в конечном итоге будут отображаться в представлении.
От Wikipedia:
Объект передачи данных (DTO), ранее известный как объекты ценности или VO, является шаблон проектирования, используемый для передачи данных между программным приложением подсистемы. DTO часто используются в сочетании с доступом к данным объекты для извлечения данных из базы данных.
DTO существуют перед лицом традиционной мудрости DonotRepeat Yourself. Будьте очень осторожны и будьте абсолютно уверенны, что вам нужен DTO