POCO = Plain Old CLR (or better: Class) Object
DTO = objet de transfert de données
Dans cet article, il y a une différence, mais franchement la plupart des blogs que j'ai lus décrivent POCO dans la façon dont le DTO est défini: les DTO sont de simples conteneurs de données utilisés pour déplacer des données entre les couches d'une application.
POCO et DTO sont-ils la même chose?
Réponses:
Un POCO suit les règles de la POO. Il doit (mais n'est pas obligé) avoir un état et un comportement. POCO vient de POJO, inventé par Martin Fowler [ anecdote ici ]. Il a utilisé le terme POJO comme un moyen de rendre plus sexy le rejet des implémentations EJB lourdes du framework. POCO doit être utilisé dans le même contexte dans .Net. Ne laissez pas les cadres dicter la conception de votre objet.
Le seul but d'un DTO est de transférer un état et ne devrait avoir aucun comportement. Voir l' explication de Martin Fowler d'un DTO pour un exemple de l'utilisation de ce modèle.
Voici la différence: POCO décrit une approche de la programmation (bonne programmation orientée objet à l'ancienne), où DTO est un modèle qui est utilisé pour "transférer des données" en utilisant des objets.
Bien que vous puissiez traiter les POCO comme des DTO, vous courez le risque de créer un modèle de domaine anémique si vous le faites. De plus, il y a un décalage dans la structure, car les DTO doivent être conçus pour transférer des données, et non pour représenter la véritable structure du domaine d'activité. Le résultat de cela est que les DTO ont tendance à être plus plats que votre domaine réel.
Dans un domaine d'une complexité raisonnable, il est presque toujours préférable de créer des POCO de domaine séparés et de les traduire en DTO. DDD (conception pilotée par domaine) définit la couche anti-corruption (un autre lien ici , mais la meilleure chose à faire est d' acheter le livre ), qui est une bonne structure qui rend la ségrégation claire.
la source
Il est probablement redondant pour moi de contribuer puisque j'ai déjà indiqué ma position dans mon article de blog, mais le dernier paragraphe de cet article résume les choses:
Donc, en conclusion, apprenez à aimer le POCO et assurez-vous de ne pas diffuser de fausses informations sur le fait qu'il s'agit de la même chose qu'un DTO. Les DTO sont de simples conteneurs de données utilisés pour déplacer des données entre les couches d'une application. Les POCO sont des objets métier à part entière avec la seule exigence qu'ils sont Ignorants de la Persistance (pas de méthodes get ou save). Enfin, si vous n'avez pas encore vérifié le livre de Jimmy Nilsson, récupérez-le dans les piles de votre université locale. Il a des exemples en C # et c'est une excellente lecture.
BTW, Patrick J'ai lu le POCO comme un article sur le style de vie, et je suis entièrement d'accord, c'est un article fantastique. C'est en fait une section du livre de Jimmy Nilsson que j'ai recommandée. Je n'avais aucune idée qu'il était disponible en ligne. Son livre est vraiment la meilleure source d'informations que j'ai trouvée sur POCO / DTO / Repository / et d'autres pratiques de développement DDD.
la source
POCO est simplement un objet qui ne dépend pas d'un framework externe. C'est PLAIN.
Qu'un POCO ait un comportement ou non, cela n'a pas d'importance.
Un DTO peut être POCO tout comme un objet de domaine (qui serait généralement riche en comportement).
En règle générale, les DTO sont plus susceptibles de prendre des dépendances sur des cadres externes (par exemple, des attributs) à des fins de sérialisation, car ils sortent généralement à la frontière d'un système.
Dans les architectures de style Onion typiques (souvent utilisées dans une approche DDD), la couche de domaine est placée au centre et ses objets ne devraient donc pas, à ce stade, avoir de dépendances en dehors de cette couche.
la source
J'ai écrit un article sur ce sujet: DTO vs Value Object vs POCO .
En bref:
la source
Je pense qu'un DTO peut être un POCO. DTO est plus sur l'utilisation de l'objet tandis que POCO est plus sur le style de l'objet (découplé des concepts architecturaux).
Un exemple où un POCO est quelque chose de différent de DTO est quand vous parlez de POCO à l'intérieur de votre modèle de domaine / modèle logique métier, qui est une belle représentation OO de votre domaine problématique. Vous pouvez utiliser les POCO tout au long de l'application, mais cela pourrait avoir des effets secondaires indésirables, comme une fuite de connaissances. Les DTO sont par exemple utilisés à partir de la couche de service avec laquelle l'interface utilisateur communique, les DTO sont une représentation plate des données et ne sont utilisés que pour fournir des données à l'interface utilisateur et communiquer les modifications à la couche de service. La couche service est chargée de mapper les deux sens du DTO aux objets du domaine POCO.
Mise à jour Martin Fowler a déclaré que cette approche est une route difficile à prendre et ne devrait être prise qu'en cas de disparité significative entre la couche de domaine et l'interface utilisateur.
la source
Un cas d'utilisation principal pour un DTO consiste à renvoyer des données à partir d'un service Web. Dans ce cas, POCO et DTO sont équivalents. Tout comportement dans le POCO serait supprimé lorsqu'il est renvoyé d'un service Web, donc peu importe qu'il ait ou non un comportement.
la source
voici la règle générale: DTO == mal et indicateur de logiciel sur-conçu. POCO == bon. les modèles «d'entreprise» ont détruit le cerveau de beaucoup de gens dans le monde Java EE. veuillez ne pas répéter l'erreur en .NET land.
la source
Les classes DTO sont utilisées pour sérialiser / désérialiser les données de différentes sources. Lorsque vous souhaitez désérialiser un objet à partir d'une source, peu importe de quelle source externe il s'agit: service, fichier, base de données, etc. objet. après cela, vous copiez ces données sur le XModel que vous souhaitez utiliser. Un sérialiseur est une belle technologie pour charger des objets DTO. Pourquoi? vous n'avez besoin que d'une fonction pour charger (désérialiser) l'objet.
la source
TL; DR:
Un DTO décrit le modèle de transfert d'état. Un POCO ne décrit rien. C'est une autre façon de dire "objet" dans la POO. Il vient de POJO (Java), inventé par Martin Fowler qui le décrit littéralement comme un nom plus sophistiqué pour «objet» parce que «objet» n'est pas très sexy.
Un DTO est un modèle d'objet utilisé pour transférer l'état entre les couches concernées. Ils peuvent avoir un comportement (c'est-à-dire peuvent techniquement être un poco) tant que ce comportement ne mute pas l'état. Par exemple, il peut avoir une méthode qui se sérialise.
Un POCO est un objet simple, mais ce que l'on entend par «simple», c'est qu'il n'est pas spécial. Cela signifie simplement que c'est un objet CLR sans motif implicite. Un terme générique. Il n'est pas fait pour fonctionner avec un autre cadre. Donc, si votre POCO a des
[JsonProperty]
décorations EF ou partout dans ses propriétés, par exemple, alors je dirais que ce n'est pas un POCO.Voici quelques exemples de différents types de modèles d'objets à comparer:
Ce ne sont que des objets, mais notez que la plupart d'entre eux sont généralement liés à un motif. Vous pouvez donc les appeler «objets» ou vous pouvez être plus précis sur son intention et l'appeler par ce qu'elle est. C'est aussi pourquoi nous avons des modèles de conception; décrire des concepts complexes dans quelques ouvrages. Le DTO est un modèle. La racine agrégée est un modèle, View Model est un modèle (par exemple MVC et MVVM). POCO n'est pas un modèle.
Un POCO ne décrit pas un modèle. C'est juste une manière différente de se référer aux classes / objets dans la POO. Considérez-le comme un concept abstrait; ils peuvent faire référence à n'importe quoi. OMI, il y a une relation à sens unique, car une fois qu'un objet atteint le point où il ne peut servir qu'un seul objectif proprement, il n'est plus un POCO. Par exemple, une fois que vous marquez votre classe avec des décorations pour la faire fonctionner avec un cadre, ce n'est plus un POCO. Donc:
Le but de faire une distinction entre les deux est de maintenir des schémas clairs et cohérents afin de ne pas croiser les préoccupations et conduire à un couplage serré. Par exemple, si vous avez un objet métier qui a des méthodes pour muter l'état, mais qui est également décoré en enfer avec des décorations EF pour l'enregistrement dans SQL Server ET JsonProperty afin qu'il puisse être renvoyé via un point de terminaison API. Cet objet serait intolérant à changer, et serait probablement jonché de variantes de propriétés (par exemple UserId, UserPk, UserKey, UserGuid, où certains d'entre eux sont marqués pour ne pas être enregistrés dans la base de données et d'autres marqués pour ne pas être sérialisés vers JSON au point de terminaison API).
Donc, si vous me disiez que quelque chose était un DTO, je m'assurerais probablement qu'il n'a jamais été utilisé pour autre chose que pour déplacer l'état. Si vous me disiez que quelque chose était un modèle de vue, je m'assurerais probablement qu'il ne soit pas enregistré dans une base de données. Si vous m'avez dit que quelque chose était un modèle de domaine, je m'assurerais probablement qu'il ne dépendait de rien en dehors du domaine. Mais si vous me disiez que quelque chose était un POCO, vous ne me diriez pas grand-chose du tout.
la source
Ne les appelez même pas DTO. On les appelle des modèles ... point final. Les modèles n'ont jamais de comportement. Je ne sais pas qui est venu avec ce terme stupide DTO mais ce doit être une chose .NET est tout ce que je peux comprendre. Pensez aux modèles de vue en MVC, même chose **, les modèles sont utilisés pour transférer l'état entre les couches côté serveur ou sur la période de connexion, ce sont tous des modèles. Propriétés avec données. Ce sont des modèles que vous passez au-dessus du fil. Modèles, Modèles Modèles. C'est ça.
Je souhaite que le terme stupide DTO s'éloigne de notre vocabulaire.
la source