Devo transformar objects Entidade (Persistente) em objects DTO?

Meu projeto é dividido da seguinte forma:

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

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

Estou transformando objects NHibernate Entity objects DTO e os transmito de DAL para BLL . Ao passar esse estado para ApplicationComponent , a BLL novamente o converte para ViewModel .

Isso me ajuda a separar as preocupações e como os dados são tratados em cada camada. Eu não sou a favor de retornar o object NHibernate Entity para ver pelas seguintes razões:

  • Os dados são expostos à UI do UI que eu quero ocultar (ou apenas expor, se necessário), como senhas, tipo de usuário, permissão etc.
  • Em referências / junçõ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 lacuna para erros.
  • Implementações de persistência vazando para a BLL / UI . Entity não é projetada para UI do UI . Não é possível veicular a UI do UI em todos os casos.
  • Usamos atributos nas propriedades do DTO para validação de input do usuário que parece estranho com Entity .

Estou enfrentando problemas com essa abordagem:

  • Problema maior e óbvio é objects redundantes com a mesma funcionalidade.
  • Eu tenho que escrever methods de mapeamento em cada camada para transformar o object. Isso pode ser minimizado usando o AutoMapper ou algo semelhante; mas isso não resolve totalmente o problema.

Questões: –

  • Isso é uma separação excessiva e deve ser evitado (pelo menos minimizado)?
  • Se esta abordagem estiver correta, não vejo nenhuma maneira simples de contornar completamente dois problemas que mencionei acima. Por favor sugira.
  • Se esta abordagem estiver incorreta, por favor sugira correções.

Referências: –

  1. Link1 sugere transferir o object Entity para ver o que, no meu entender, não é uma boa ideia.

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

  3. Link3 não ajuda.

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

  5. Link5 é ótimo post. Explica por que esses devem ser separados, o que estou de acordo. Ele não comenta como minimizar a sobrecarga causada por ele.

  6. Link6 não é útil novamente.

Editar 1:

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

Editar 2:

Outro excelente post sugere mapear de duas maneiras como eu estou fazendo agora. Ainda não sugere uma maneira de minimizar a sobrecarga.