Если свойства в Data Transfer Object расширяют внешние ключи или просто предоставляют их первичные ключи

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам