construtor - criar objeto c#



Devo transformar objetos de entidade(persistente) em objetos de DTO? (1)

Meu projeto está em camadas da seguinte maneira: -

DAL (Entity) -> BLL (DTO) -> ApplicationComponent (ViewModel) .

Haverá vários componentes do aplicativo ( ApplicationComponent ) que BLL . Os componentes incluem serviços do Windows, serviços da Web, API da Web e controlador MVC.

Estou transformando os objetos NHibernate Entity objetos DTO enquanto os passa do DAL para o BLL . Ao passar esse estado para ApplicationComponent , o BLL converte novamente em ViewModel .

Isso me ajuda a separar as preocupações e como os dados são tratados em cada camada. Não sou a favor do retorno do objeto NHibernate Entity para exibição pelos seguintes motivos: -

  • Os dados são expostos à UI do UI que eu quero ocultar (ou expor apenas se necessário) como senhas, tipo de usuário, permissão etc.
  • Em referências / associações, o NHibernate executa consultas adicionais quando a propriedade é acessada, o que anula o uso de carregamento lento.
  • Dados desnecessários expostos ao usuário (da Entity ) criam confusão e lacunas para erros.
  • Implementações de persistência vazando no BLL / UI . Entity não foi projetada para UI do UI . Ele não pode servir a UI do UI em todos os casos.
  • Usamos atributos nas propriedades do DTO para validação de entrada do usuário que parece estranha com a Entity .

Estou enfrentando os seguintes problemas com esta abordagem:

  • O maior e óbvio problema são os objetos redundantes com a mesma funcionalidade.
  • Eu tenho que escrever métodos mapeador em cada camada para transformar o objeto. Isso pode ser minimizado usando o AutoMapper ou algo semelhante; mas não resolve completamente o problema.

Questões: -

  • É uma separação excessiva e deve ser evitada (pelo menos minimizada)?
  • Se essa abordagem estiver correta, não vejo uma maneira simples de ignorar completamente dois problemas que afirmei acima. Por favor sugira.
  • Se essa abordagem estiver incorreta, sugira correções.

Referências: -

  1. Link1 sugere transferir o objeto Entity para visualizar o que, no meu entendimento, não é uma boa ideia.

  2. Link2 sugere mapear a Entity com o DTO que eu já estou de acordo.

  3. Link3 não ajuda.

  4. Link4 sugere usar algo como ferramentas de mapeador automático, o que é bom. Mas ainda não resolve o problema completamente.

  5. Link5 é ótimo post. Explica por que eles devem ser separados, e eu concordo. Não comenta como minimizar a sobrecarga causada por ele.

  6. Link6 não é útil novamente.

Editar 1:

Acabei de ler this excelente resposta, que sugere usar a Entity como está na UI do UI se possível . Ainda não se aplica à maior parte do meu projeto.

Edição 2:

Outro excelente post sugere continuar mapeando nos dois sentidos, como estou fazendo agora. Ainda não sugere uma maneira de minimizar a sobrecarga.


O nhibernate é um daqueles sistemas que permitem evitar entidades DAL e será melhor para o desempenho evitar mapeamento extra do BLL para o DAL, mas se não for crítico para você, será melhor mantê-lo como é ter camadas de aplicação soltas acopladas





data-access-layer