Должен ли уровень хранилища возвращать объекты передачи данных (DTO)? - PullRequest
23 голосов
/ 21 февраля 2011

У меня есть уровень хранилища, который отвечает за мой доступ к данным, который вызывается уровнем обслуживания. Сервисный уровень возвращает DTO, которые сериализуются и отправляются по проводам. Чаще всего сервисы делают немного больше, чем просто получают доступ к хранилищу и возвращают все, что возвращает хранилище.

Но чтобы это работало, хранилище должно возвращать экземпляр этого DTO. В противном случае сначала нужно отобразить объект уровня данных, который репозиторий возвращает DTO на уровне служб, и вернуть его. Это просто кажется расточительным.

Кроме того, если создание DTO происходит на уровне сервиса, то, что могло быть сделано раньше в одном вызове репозитория и, следовательно, в одном запросе к базе данных, теперь должно произойти с несколькими вызовами репозитория на уровне сервиса, чтобы ' составить окончательный DTO. Если, конечно, я не создаю транспортный объект между уровнем данных и уровнем обслуживания, который может содержать такой составной объект. Который затем должен быть сопоставлен с DTO. Это просто кажется расточительным ради чистоты. Но также неправильно чувствовать, что слой репозитория возвращает объекты, которые просто существуют, для отправки по проводам.

Ответы [ 2 ]

15 голосов
/ 21 февраля 2011

Краткий ответ: Нет.

Длинный ответ: хранилище отвечает за возврат сохраненных данных обратно к сущностям (моделям) и наоборот.

Модель - это бизнес-модель, представляющая бизнес-объект. DTO, с другой стороны, хотя и выглядит как модель, занимается передачей объекта между различными средами и, по сути, является временным объектом. Обычно картостроители отвечают за превращение модели в DTO.

0 голосов
/ 12 апреля 2019

То есть вашему хранилищу необходимо увлажнить всю сущность, даже если она не используется? Это кажется очень неэффективным. - ajbeaven 29 октября '18 в 23: 25

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

Чтобы ответить на вопрос, я согласен с принятым ответом Нет. Реализации репозитория находятся в постоянном слое. Уровень домена может потребоваться для извлечения глубоких или мелких объектов из уровня постоянства, который ничего не знает, кроме интерфейса, который он должен реализовать. Если домен постоянно запрашивает полный холодильник, когда ему нужно только масло, тогда, возможно, интерфейсу (или модели данных) нужно немного поработать.

...