DTO = ViewModel?

102

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?

autonomatt
fonte
9
Eu acho que é relevante mencionar que ViewModels em ASP.NET MVC não são 100% equivalentes a ViewModels em WPF (MVVM), já que a maioria das respostas menciona MVVM e você está trabalhando com ASP.NET MVC.
Matthijs Wessels,

Respostas:

104

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.

Daniel Auger
fonte
Você pode explicar isso: "DTO é a forma de dados de um objeto sem nenhum comportamento"?
roozbeh S
2
Significando ... a classe DTO geralmente contém apenas propriedades e não contém nenhum método com lógica de negócios, etc ...
Daniel Auger
71

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.

Raio
fonte
4
Esta é uma boa resposta; embora com poucos detalhes.
Phil
5
Por que o ViewModel em asp.net mvc deve ser igual a um DTO? Isso não faz sentido. Um ViewModel pode ter um comportamento diferente de DTO. Isso não depende do mvc.
Elisabeth de
8
+1 para diferenciar entre ASP.NET MVC ViewModel e MVVM ViewModel.
Ronald
5
@Elisa - A resposta à sua velha pergunta é que na ASP.NET MVC, a visão invoca Actions no controlador (não um ViewModel) para alterar o modelo e a visão de uma maneira sem estado. Por causa disso, um DTO moldado para uma visualização é essencialmente o mesmo que ViewModel. No entanto, em sistemas maiores com outro limite de serialização, um DTO pode ser benéfico se for separado de um ViewModel formado especificamente para a View.
dansan
27

DTO! = ViewModel

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.

Stiank81
fonte
2
então DTOs podem ser apenas structs (ou é uma classe que deve imitar os recursos de um struct)?
Max Alexander
20

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

David
fonte
13

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.

riadh gomri
fonte
1
Acabei de instalar o VS 2012 e olhei seu aplicativo MVC 4 de página única. No projeto de amostra, os DTOs são usados ​​como parâmetros para métodos (ou ações) do controlador no WebApi. Em outras palavras, JSON é postado nesses métodos e, com alguma mágica do MVC, os dados são automaticamente convertidos em DTOs antes de serem passados ​​para os métodos. Você acha que é errado usar DTOs neste caso? O ViewModels deve ser usado com uma API da Web? Estou pedindo para entender melhor, porque ainda não estou tão familiarizado com esses conceitos.
Jean-François Beauchamp
Salut Jean-François Beauchamp :) ASP.NET MVC pode analisar prams url em um objeto, por exemplo: suponha que eu tenha esse mapeamento para um método Index ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "em vez de ter no índice de controle (int jobID, int ResultsToSkip, int ResultsToSend) Eu terei Index (request) (request é um objeto que encapsula 3 campos jobID ...) Então agora em vez de params, você está falando com seu aplicativo com objetos que encapsulam DATA, então sim, podemos dizer requestDTO. Por exemplo, você tem que adicionar um outro campo e alterar apenas o DTO, não os métodos de interface da API.
riadh gomri
9

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).

sgwill
fonte
2
Boa resposta pragmática.
Simon Tewsi em
0

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.

Lalit Khanna
fonte
-1

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.

Md. Saddam Hossain
fonte