Je fonde cette question sur Fowler PoEAA. Étant donné votre familiarité avec ce texte, les ViewModels utilisés dans ASP.NET MVC ne sont-ils pas les mêmes que les DTO? Pourquoi ou pourquoi pas? Je vous remercie.
Réponses
Trop de publicités?Ils servent un but similaire (encapsulation des données pour une autre couche de l'application), mais ils le font de manière différente et pour des raisons différentes.
-
Le but d'un DTO est de réduire le nombre d'appels entre les niveaux d'une application, en particulier lorsque ces appels sont coûteux (par exemple, systèmes distribués). Les dto sont presque toujours trivialement serializable, et en général ne contiennent pas de comportement.
Par exemple, vous êtes l'élaboration d'un site de e-Commerce.
NewCustomer
etNewOrder
sont des activités distinctes, mais que pour des raisons de performances à agréger leurs données enNewCustomerAndOrderDto
, de sorte que votre client a seulement besoin de faire un aller-retour vers le serveur lors de l'exécution de ces deux opérations en même temps. -
Le terme "ViewModel" signifie des choses légèrement différentes dans différentes saveurs de MV*, mais dont le but est principalement la séparation des préoccupations. Votre Modèle est souvent optimisé pour un but autre que la présentation, et il est de la responsabilité du ViewModel de dissocier votre point de Vue à partir du Modèle de mise en œuvre de détails. En outre, la plupart des MV* modèles conseillons de faire votre point de Vue en tant que "bête" que possible, et donc le ViewModel parfois assume la responsabilité de la logique de présentation.
Par exemple, dans la même application e-Commerce, votre
CustomerModel
est le mal "forme" pour la présentation de votre "Nouveau Client" point de Vue. Pour commencer, votre point de Vue a deux champs de formulaire pour votre utilisateur à entrer et confirmer leur mot de passe, et votreCustomerModel
ne contient pas un champ de mot de passe à tous! VotreNewCustomerViewModel
contiendra les champs et pourrait (selon votre goût de MV*) être responsable de la base de validation.
Le but est différent:
- Les DTO sont utilisés pour transférer des données
- Les ViewModels sont utilisés pour afficher des données à un utilisateur final.
Donc, normalement, les ViewModels contiennent les données de présentation, ce qui dans de nombreux cas est similaire à ce qui est dans un DTO, mais avec quelques différences. Pensez à la représentation des énumérations, de la localisation, de la devise, des formats de date, .... En effet, normalement, il ne devrait pas y avoir de logique à votre avis.
Les DTO dans MVVM et MVP sont généralement des objets très stupides et ne sont essentiellement qu'un groupe de setters et de getters de propriété. Les ViewModels d'autre part peuvent avoir un certain comportement.
Un effet secondaire positif pratique d'avoir des DTO est de faciliter la sérialisation. Si vous avez un objet plutôt complexe, disons C #, vous devrez souvent désactiver de manière sélective les choses que vous ne voulez pas sérialiser. Cela peut devenir plutôt moche et les DTO simplifient ce processus.
Un modèle de vue et un objet de transfert de données présentent des similitudes et des différences.
Similaire: transférer les données d'un enregistrement (instance d'objet, peut-être sérialisé) vers un récepteur, qu'il s'agisse d'une vue ou d'un service
Différence: un modèle de vue est destiné à être envoyé à une vue, où il sera affiché, avec mise en forme. Un modèle de vue renvoie également des données à un contrôleur. Un DTO n'est généralement pas destiné à être présenté. Il est destiné à envoyer des données brutes.