Если свойства в Data Transfer Object расширяют внешние ключи или просто предоставляют их первичные ключи - PullRequest
4 голосов
/ 22 марта 2011

У меня есть EmployeeDTO, который представляет запись сотрудника в базе данных.Таблица Employee имеет отношение к отделу и отношение «1 ко многим» к разрешению.

В моих объектах они представлены как полностью расширенное свойство Department и список полностью развернутых объектов разрешения.

Вопрос в том, должен ли DTO иметь полностью расширенное свойство DepartmentDTO для DepartmentId?Должен ли DTO иметь список полностью расширенных свойств PermissionDTO List of PermissionId?

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Как и все в дизайне, все зависит от ваших потребностей.

  • Если вам нужно часто видеть и привязать к дочерним свойствам, и вы хотите сделать это как можно проще для разработчики использовать ваши DTO, вы можете хочу явные фабричные методы, чтобы дать Вы полностью раскрыли дочерние свойства.
  • Если вы хотите простоты кода, не расширить свойства внешнего ключа и просто позвольте разработчикам заполучить ребенка объект / коллекции они хотят по ключу по мере необходимости.

Вы можете столкнуться с проблемами в рекурсии; Вы также расширяете все свойства внешнего ключа объекта Department? Что если есть ссылка на другого EmployeeDTO в подклассе Department?

Microsoft Entity Framework, как и другие популярные платформы бизнес-объектов, обрабатывает эту концепцию путем отложенной загрузки - извлекает полностью расширенное дочернее свойство, только если оно вызвано кодом. Это, вероятно, наиболее гибкое решение, но имеет небольшие издержки / задержки, поскольку дочерние свойства не могут быть получены при том же вызове базы данных, что и родительский объект. Это, конечно, не просто DTO.

2 голосов
/ 22 марта 2011

Да и Нет. Это зависит от вызова и от того, нужны ли вам все дополнительные свойства при каждом вызове. Это также может зависеть от используемой вами технологии ORM, которая может реализовать отложенную загрузку и может повлиять на ваше решение (если вы передаете объекты прямой сущности, хотя это не рекомендуется ).

Обычно создается один случайный DTO, содержащий все необходимые свойства и один или несколько объектов DTO, которые предоставляют больше функциональных возможностей и используются другими методами. Например, у меня есть класс BasicUser, который содержит только UserName и DisplayName, и у меня есть User, который содержит больше, включая Permissions и наследует от `BasicUser.

...