As propriedades no Data Transfer Object devem expandir as chaves estrangeiras ou simplesmente expor suas chaves primárias

StackOverflow https://stackoverflow.com/questions/5392093

Pergunta

Tenho um EmployeeDTO que representa um registro de Funcionário no banco de dados.A tabela Funcionário tem um relacionamento com um Departamento e um relacionamento de 1 para muitos com Permissão.

Em minhas entidades, eles são representados como uma propriedade do Departamento totalmente expandida e uma Lista de objetos de permissão totalmente expandidos.

A questão é se o DTO deve ter uma propriedade DepartmentDTO totalmente expandida de um DepartmentId?O DTO deve ter uma lista de propriedades PermissionDTO totalmente expandidas de List of PermissionId?

Foi útil?

Solução

Assim como tudo em design, depende de suas necessidades.

  • Se você precisa ver e vincule a propriedades filho e você deseja para torná-lo o mais fácil possível para desenvolvedores para usar seus DTOs, você pode quer métodos de fábrica explícitos para dar você expandiu totalmente as propriedades filho.
  • Se você deseja simplicidade de código, não expandir as propriedades da chave estrangeira e apenas deixe os desenvolvedores pegarem a criança objeto / coleções que desejam por chave conforme necessário.

Você pode ter problemas na recursão; você também expande todas as propriedades de chave estrangeira do objeto Departamento? E se houver uma referência a outro EmployeeDTO em uma subclasse de Departamento?

O Entity Framework da Microsoft, bem como outros frameworks de objetos de negócios populares, lidam com esse conceito por carregamento lento - somente busca a propriedade filho totalmente expandida se for solicitada pelo código. Esta é provavelmente a solução mais flexível, mas tem uma pequena sobrecarga / atraso, pois as propriedades filho não podem ser obtidas na mesma chamada de banco de dados que o objeto pai. É claro que não são apenas DTOs.

Outras dicas

Sim e não. Depende da chamada e se você precisaria de todas as propriedades extras em cada chamada.Também pode depender da tecnologia ORM que você usa, que pode implementar o carregamento lento e pode afetar sua decisão (se você estiver passando objetos de entidade diretamente, embora não seja recomendado ).

É comum criar um DTO de caso contendo todas as propriedades necessárias e um ou mais objetos DTO que expõem mais funcionalidade e são usados em outros métodos.Por exemplo, eu tenho uma classe BasicUser que contém apenas UserName e DisplayName e tenho User que contém mais, incluindo Permissions e herda de `BasicUser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top