Estou usando o NHibernate para persistir meus objetos de domínio. Para manter as coisas simples, estou usando um projeto ASP.NET MVC como minha camada de apresentação e minha camada de serviço.
Eu quero retornar meus objetos de domínio em XML de minhas classes de controlador. Depois de ler alguns posts aqui no Stack Overflow, concluí que os DTOs são o caminho a percorrer. No entanto, eu também encontrei posts falando sobre ViewModel.
Minha pergunta: Data Transfer Objects e ViewModels são a mesma coisa? Ou um ViewModel é um tipo de subpadrão de um DTO?
asp.net-mvc
domain-driven-design
viewmodel
dto
autonomatt
fonte
fonte
Respostas:
A definição canônica de um DTO é a forma dos dados de um objeto sem qualquer comportamento.
ViewModels são o modelo da visualização. ViewModels normalmente são dados completos ou parciais de um ou mais objetos (ou DTOs) mais quaisquer membros adicionais específicos para o comportamento da visão (métodos que podem ser executados pela visão, propriedades para indicar como alternar os elementos da visão etc ...). Você pode ver o modelo de visão como todos os dados de uma visão mais os comportamentos. ViewModels pode ou não mapear um a um para objetos de negócios ou DTOs.
A propósito, as projeções do NHibernate são úteis se um determinado modelo de visão precisa de um subconjunto dos dados de um objeto persistente.
fonte
ViewModel na prática ASP.NET MVC é igual ao DTO, entretanto ViewModel no padrão MVVM é diferente de DTO porque ViewModel em MVVM tem comportamentos, mas DTO não.
fonte
No padrão MVVM, o ViewModel é usado para isolar o Model da View. Para representar o modelo, você pode usar classes DTO simples , que novamente são mapeadas para um banco de dados por exemplo, NHibernate. Mas eu nunca vi uma classe ViewModel que seja modelada como um DTO. As classes ViewModel geralmente têm comportamento, o que os DTOs não têm.
fonte
DTO - Data Transfer Objects são exatamente como diz, containers para transferência de dados. Eles não têm comportamento, mas apenas um grupo de setters e getters. Algumas pessoas os tornam imutáveis e apenas criam novos quando necessário, em vez de atualizar os existentes. Eles devem ser serializáveis para permitir a transferência através do fio.
Geralmente, os DTOs são usados para enviar dados de uma camada para outra através dos limites do processo, pois as chamadas para um serviço remoto podem ser caras, de modo que todos os dados necessários são colocados em um DTO e transferidos para o cliente em um bloco (granulação grossa).
No entanto, algumas pessoas usam a noção de DTOs ligados à tela (nada a ver com o cruzamento dos limites do processo). Novamente, eles são preenchidos com os dados necessários (geralmente os dados necessários para uma tela específica e podem ser uma agregação de dados de várias fontes) e enviados ao cliente.
http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx
Em casos simples, como já foi declarado, este DTO pode ser usado para vincular à visualização, mas em casos mais complexos, exigiria a criação de um ViewModel e o descarregamento de dados do DTO para ViewModel, o que obviamente é mais trabalhoso (ao aplicar o padrão MVVM) .
Então, novamente, como já foi afirmado DTO! = ViewModel
e
DTO e ViewModel têm finalidades diferentes na vida
fonte
Primeiro, a principal diferença é que ViewModel pode ter comportamentos ou métodos que o DTO não deve fazer !!!
Em segundo lugar, usar DTO como um ViewModel na ASP.NET MVC torna seu aplicativo fortemente acoplado ao DTO e esse é exatamente o propósito oposto de usar DTO. Se você fizer isso, qual é a diferença de usar seu modelo de domínio ou DTO, mais complexidade para obter um antipadrão?
Além disso, ViewModel no ASP.NET pode usar DataAnnotations para validação.
O mesmo DTO pode ter mapeamento de ViewModels diferentes, e One ViewModel pode ser composto de DTO diferentes (sempre com mapeamento de objeto, não composição). porque eu acho que é ainda pior se você tiver um ViewModel que contenha um DTO, teremos o mesmo problema.
Da sua camada de apresentação, pense no DTO como um contrato, você receberá um objeto que você deve considerar como estranho à sua aplicação e não tem nenhum controle sobre ele (mesmo que você tenha ex o serviço, o dto e as camadas de apresentação são seus).
Finalmente, se você fizer essa separação limpa, os desenvolvedores podem trabalhar juntos com facilidade. A pessoa que projeta ViewModels, Views e Controllers não precisa se preocupar com a camada de serviço ou a implementação de DTO porque ele fará o mapeamento quando os outros desenvolvedores terminarem sua implementação ... Ele pode até usar a ferramenta de simulação ou simulação manual para preencher a camada de apresentação com dados para teste.
fonte
Para algumas visualizações simples, usarei meu DTO como meus modelos, mas à medida que as visualizações se tornarem mais complexas, criarei ViewModels.
Para mim, é um equilíbrio entre rapidez (usando DTO, uma vez que já os tenho) e flexibilidade (criar ViewModels significa mais separação de interesses).
fonte
Se você usar DTO como ViewModel, isso significa que você está fazendo alta dependência de DTO por causa de algum motivo pelo qual está alterando o DTO, então isso pode impactar ViewModel.
Melhor usar DTO e converter em viewmodel.
fonte
Podemos usar DTOmesmo que a classe Model e podemos usar viewmodel quando precisamos mostrar / usar vários dados / propriedades de modelos em uma única visualização. Exemplo: Eu crio algum modelo usando o banco de dados de estrutura de entidade primeiro. Então, agora todo o modelo é gerado com base no banco de dados. e agora precisamos da anotação de dados, para essas anotações de dados podemos criar uma pasta com o nome DTO, nesta pasta DTO, podemos manter todos os modelos exatos que já geram e adicionar anotação de dados acima da propriedade. Então, podemos usar qualquer operação (usar controlador, visualizações) usando essas classes DTO. E quando precisamos de uma visão complexa, quero dizer, quando precisamos de dados de várias classes em uma visão, podemos usar o modelo de visão. Para viewmodel, podemos criar uma pasta com o nome de viewmodel e, em seguida, criar uma classe personalizada e manter a propriedade de que precisamos. Tentei me limpar. Qualquer sugestão será muito apreciada.
fonte