web-dev-qa-db-fra.com

DTO = ViewModel?

J'utilise NHibernate pour conserver mes objets de domaine . Pour simplifier les choses, j'utilise un projet ASP.NET MVC à la fois comme couche de présentation et comme couche de service.

Je souhaite renvoyer mes objets de domaine en XML à partir de mes classes de contrôleur. Après avoir lu quelques articles sur Stack Overflow, je pense que les DTO sont la voie à suivre. Cependant, j'ai aussi rencontré des articles sur le ViewModel.

Ma question: les objets de transfert de données et les modèles de vue sont-ils la même chose? Ou un ViewModel est-il une sorte de sous-motif d'un DTO?

90
autonomatt

La définition canonique d'un DTO est la forme de données d'un objet sans aucun comportement.

ViewModels sont le modèle de la vue. Les ViewModels sont généralement des données complètes ou partielles d'un ou plusieurs objets (ou DTO), ainsi que de tout membre supplémentaire spécifique au comportement de la vue (méthodes pouvant être exécutées par la vue, propriétés permettant d'indiquer comment basculer entre les éléments de la vue, etc.). Vous pouvez consulter le modèle de vue comme toutes les données d'une vue et de ses comportements. ViewModels peut ou non mapper un à un vers des objets métier ou des DTO.

Au fait, NHibernate projections est pratique si un certain modèle de vue nécessite un sous-ensemble des données d’un objet persisté.

87
Daniel Auger

ViewModel dans la pratique ASP.NET MVC est identique au DTO, cependant ViewModel dans le modèle MVVM est différent du modèle DTO car ViewModel dans MVVM a des comportements, mais pas le DTO.

60
Ray

DTO! = ViewModel

Dans le motif MVVM , ViewModel est utilisé pour isoler le modèle de la vue. Pour représenter le modèle, vous pouvez utiliser les méthodes simples DTO , qui sont à nouveau mappées vers une base de données, par exemple. NHibernate. Mais je n'ai jamais vu de classe ViewModel modélisée comme un DTO. Les classes ViewModel ont généralement un comportement, ce que les DTO n'ont pas. 

28
stiank81

DTO - Les objets de transfert de données sont exactement comme il est dit, des conteneurs pour transférer des données. Ils n'ont pas de comportement mais simplement un groupe de setters et de getters. Certaines personnes les rendent immuables et n'en créent que de nouvelles au besoin plutôt que de mettre à jour celles existantes. Ils doivent être sérialisables pour permettre le transfert sur le fil.

En règle générale, les DTO sont utilisés pour transmettre des données d’une couche à l’autre au travers des processus car les appels vers un service distant peuvent être coûteux, de sorte que toutes les données requises sont insérées dans un DTO et transférées au client en une seule fois (gros grains).

Cependant, certaines personnes utilisent la notion de DTO liés à l’écran (rien à voir avec le croisement des limites de processus). Là encore, elles sont renseignées avec les données requises (généralement les données requises pour un écran particulier et pourraient être une agrégation de données provenant de différentes sources) et envoyées au client.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

Dans des cas simples, comme cela a déjà été indiqué, ce DTO peut être utilisé pour la liaison à la vue, mais dans des cas plus complexes, il faudrait créer un ViewModel et décharger des données de DTO vers ViewModel, ce qui représente évidemment plus de travail (lors de l'application du modèle MVVM). .

Encore une fois, comme déjà indiqué DTO! = ViewModel

et

DTO et ViewModel ont des buts différents dans la vie

18
David

Tout d’abord, la différence majeure est que ViewModel peut avoir un comportement ou des méthodes que DTO ne doit pas! 

Deuxièmement, l'utilisation de DTO en tant que ViewModel dans ASP.NET MVC permet à votre application d'être étroitement couplée à DTO, ce qui est exactement l'objectif inverse de l'utilisation de DTO. Si vous le faites, quelle est la différence avec votre modèle de domaine ou votre DTO, plus de complexité pour obtenir un anti-motif?

ViewModel dans ASP.NET peut également utiliser DataAnnotations pour la validation. 

Le même DTO peut avoir un mappage ViewModels différent, et un ViewModel peut être composé à partir de différents DTO (toujours avec un mappage d'objet et non une composition). Parce que je pense que c'est encore pire si vous avez un ViewModel contenant un DTO, nous aurons le même problème.

À partir de votre couche de présentation, considérez DTO comme un contrat, vous recevrez un objet que vous devez considérer comme étranger à votre application et n’ayant aucun contrôle sur celui-ci (même si vous disposez des couches ex service, dto et presentation sont vôtres).

Enfin, si vous faites cette séparation nette, les développeurs peuvent travailler ensemble avec facilité ... La personne qui conçoit les modèles de vue, les vues et les contrôleurs n'a pas à se soucier de la couche de service ni de la mise en œuvre DTO Les développeurs finissent leur implémentation .... Il peut même utiliser l’outil moqueur ou le moquage manuel pour remplir la couche de présentation avec des données à tester.

12
riadh gomri

Pour certaines vues simples, je vais utiliser mon DTO comme modèle, mais à mesure que les vues deviennent plus complexes, je crée ViewModels. 

Pour moi, c'est un équilibre entre rapidité (utilisation de DTO, puisque je les ai déjà) et flexibilité (créer ViewModels signifie plus de séparation des problèmes).

8
sgwill

Si vous utilisez DTO en tant que ViewModel, cela signifie que vous dépendez beaucoup de DTO pour une raison quelconque si vous changez DTO, cela pourrait avoir un impact sur ViewModel.

Mieux utiliser DTO et convertir en viewmodel.

0
Lalit Khanna