1. #1
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 693
    Points : 3 026
    Points
    3 026

    Par défaut Quelle est la différence entre un DTO et un POCO ?

    Cette discussion est consacrée à l'article intitulé "Quelle est la différence entre un DTO et un POCO ?" qui est la traduction d'un article de Rudy Lacovara.

    Postez ici vos commentaires concernant cette publication.


  2. #2
    Membre averti
    Profil pro
    Inscrit en
    février 2003
    Messages
    836
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : février 2003
    Messages : 836
    Points : 371
    Points
    371

    Par défaut

    Excellent article ! très utile. Maintenant, j'ai une petite question :

    Quid du DTO pour lequel on est obligé d'insérer la logique de sérialisation car il implémente IXmlSerializable ? c'est un DTO, un POCO, ni l'un ni l'autre ?

    Sinon, concernant les différents schémas d'implantation, en voici un que j'utilise tous les jours :

    J'ai ma couche d'accès aux données branchée via l'ORM Entitiy Framework.
    J'ai donc une partie DAL me permettant d'effectuer les requetes linq to entities.
    Ensuite, j'ai une parti BLL qui me permet de faire tous les mix de requetes dont j'ai besoin et ressortir un résultat métier.
    Entre la DAL et la BLL, je transforme (de façon bilatérale) mes Entities en DTO et inversement.
    Le tout est au final utilisable avec n'importe quel projet et peut même etre partagé entre projets de types différents.
    Dans mon cas, j'ai branché un webservice WCF à la BLL et il va y avoir une partie ASP.Net MVC2 qui viendra plus tard se brancher sur cette meme BLL.
    Ce qu'il y a d'intéressant avec les DTO, c'est que derriere ils peuvent être importés dans tous les projets se servant de ma BLL (ou meme de mon webservice).

    En tout cas, merci pour l'explication

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 693
    Points : 3 026
    Points
    3 026

    Par défaut

    Citation Envoyé par zax-tfh Voir le message
    Quid du DTO pour lequel on est obligé d'insérer la logique de sérialisation car il implémente IXmlSerializable ? c'est un DTO, un POCO, ni l'un ni l'autre ?
    D'après l'article, je dirais que c'est ni l'un, ni l'autre.

    En effet, il est dit qu'un DTO n'est qu'un conteneur de données sans logique d'aucune sorte ; et qu'un POCO ne contient pas de logique de persistance (concept de "Persistance Ignorance").

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    juillet 2010
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : juillet 2010
    Messages : 657
    Points : 1 226
    Points
    1 226

    Par défaut

    chez moi toutes les couches d'une application ont accès aux DTO , seul la couche "business" a acces aux POCO ( ou pojo , etc ... ).
    un POCO est forcément lié au business layer,puisqu'il a un comportement.
    Un DTO peut par contre alimenter un template , le modèle , ou n'importe quoi d'autre.

  5. #5
    Inactif
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 604
    Points : 13 209
    Points
    13 209

    Par défaut

    Article clair et didactique !

    Je viens donc de réaliser que je suis depuis plus de dix ans un M. Jourdain du POCO/DTO.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 693
    Points : 3 026
    Points
    3 026

    Par défaut

    Citation Envoyé par Bluedeep Voir le message
    Je viens donc de réaliser que je suis depuis plus de dix ans un M. Jourdain du POCO/DTO.
    Oui, avec l'expérience, on tend naturellement vers de bonne pratiques (ou en tous cas, des pratiques éprouvées), sans forcément connaitre les termes qui définissent ces pratiques !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    février 2003
    Messages
    836
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : février 2003
    Messages : 836
    Points : 371
    Points
    371

    Par défaut

    Dites moi, dans vos projets, comment faites vous la translation POCO<->DTO ?
    Avez vous des petits outils, des patterns ou autres qui permettent d'automatiser un peu la transformation ? ou bien gérez vous la copie des propriétés à la mano ?

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 693
    Points : 3 026
    Points
    3 026

    Par défaut

    Citation Envoyé par zax-tfh Voir le message
    Dites moi, dans vos projets, comment faites vous la translation POCO<->DTO ?
    Avez vous des petits outils, des patterns ou autres qui permettent d'automatiser un peu la transformation ? ou bien gérez vous la copie des propriétés à la mano ?
    Qu'entends-tu par translation/transformation ?

    Le lien entre un DTO et son POCO correspondant est qu'un POCO a un DTO, les propriétés ne sont pas "copiées" :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class PersonDTO
    {
        // Propriétés du DTO...
    }
     
    public class PersonPOCO
    {
        public PersonDTO Data { get; set; }
     
        public PersonPOCO(PersonDTO dto) { this.Data = dto; }
    }
    Les propriétés du DTO sont accessibles dans le POCO via la propriété Data.
    Voir l'héritage "a un", dans le paragraphe "Alors qu'est-ce qu'un POCO ?"

  9. #9
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juillet 2004
    Messages : 3 029
    Points : 11 012
    Points
    11 012

    Par défaut

    Je me joins aux autres pour te féliciter de ton choix de traduction, l'article choisi est excellent, et la traduction de qualité

    bravo

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  10. #10
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Ingénieur d'études et de développement C#
    Inscrit en
    février 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études et de développement C#
    Secteur : Conseil

    Informations forums :
    Inscription : février 2007
    Messages : 814
    Points : 1 244
    Points
    1 244

    Par défaut

    Confronté à un problème d'architecture, je me suis penché sur cet article.

    Et je me demande comment gérer la composition/agrégation dans ce modèle ?

    En effet, mes objets ont quelques propriétés de type primitif, mais aussi un gros paquet d'instances, voire de collections, d'autre classes.

    Pour être précis sur ma question : à quel niveau gère-t-on la composition ?
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  11. #11
    Invité
    Invité(e)

    Par défaut

    Au niveau des POCO tu peux utiliser tous les concepts de la POO sans problèmes mais pour les DTO tu peux aussi le faire mais il faut avant tout savoir que les DTO c'est pour faire transiter des données être un pont entre deux parties ou doit contenir des informations minimalistes dont on a besoin quand on travaille par exemple avec des services telles que WCF. Bref un DTO ne doit pas contenir la complexité de ton modèle ou domaine. Si tu te mets à te poser des questions de composition excédant deux niveaux alors là je ne vois plus l'intérêt d'utiliser les DTO autant utiliser directement ton modèle pour ne pas avoir à tout le recréer en intégrant sa complexité dans les DTO.

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 851
    Points : 4 128
    Points
    4 128

    Par défaut

    Hello,

    Comme tout le monde l'a déjà dit, il s'agit là d'un excellent article (comme tous les autres (ou presque) du même auteur).

    Par contre cela me pose un souci.

    Avant, la couche BLL passait directement les DTO ou les listes de DTO à la couche GUI qui les utilisait et les renvoyait vers BLL.

    A la lumière de cet article, GUI utilise maintenant des objets de la BLL (des POCO donc) qui contiennent les DTO.

    Mais du coup, comment on fait pour affecter les propriétés DisplayMember et ValueMember des classes du genre ComboBox ou ListBox (pour DisplayMember, j'ai triché en surchargeant la méthode ToString du POCO mais c'est du bricolage non ?)

    Et je n'ai pas encore testé mais j'imagine que je vais avoir le même problème pour affecter la propriété DataPropertyName de la classe DataGridViewColumn.

    Comme faites-vous donc ?
    Kropernic

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    février 2003
    Messages
    836
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : février 2003
    Messages : 836
    Points : 371
    Points
    371

    Par défaut

    Salut,

    Dans notre projet (Silverlight / WCF) on avait cette problématique étant donné que le fait de recevoir d'une part, une liste de DTO pour alimenter l'itemssource du combobox et, d'autre part, le DTO correspondant à l'élement actuellement sélectionné via le webservice faisait que les deux DTO identiques (celui qui est la sélection courante et celui qui fait partie de la liste et qui en base correspondent a la meme ligne) n'avaient pas la meme adresse mémoire.
    Du coup, en surchargeant la méthode Equals pour faire matcher les property Id plutot que les références mémoire a résolu le problème.

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 851
    Points : 4 128
    Points
    4 128

    Par défaut

    Euh... J'ai pas compris
    Kropernic

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    février 2003
    Messages
    836
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : février 2003
    Messages : 836
    Points : 371
    Points
    371

    Par défaut

    Comment utilises tu ta combo, peux tu envoyer un exemple ? parce que je ne sais meme pas dans quel type de projet tu bosses (winforms, wpf, silverlight, win8, wp8 ?)

  16. #16
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 851
    Points : 4 128
    Points
    4 128

    Par défaut

    Je fais du winforms.

    Mais je pense que je faisais de la merde (j'ai contourné le problème en faisant autrement et ça va mieux maintenant ^^).

    Exemple de ce que je faisais :
    J'avais un poco Person avec une propriété DTO as PersonDTO et un poco Persons qui héritait de List(Of Person).
    Du coup, dans la GUI, j'utilisais des objets du type Persons pour manipuler des listes. Mais ce genre de truc, c'est pas pratique à passer en datasource.

    Maintenant, le poco Persons n'hérite plus de List(Of PersonDTO) mais a une propriété DTO as List(Of PersonDTO). Et ça va tout de suite mieux ^^
    Kropernic

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/06/2010, 16h57
  2. Réponses: 5
    Dernier message: 03/05/2005, 18h22
  3. Réponses: 11
    Dernier message: 31/01/2005, 17h48
  4. Quelle est la différence entre le float et le real ?
    Par Manson dans le forum Débutant
    Réponses: 3
    Dernier message: 10/08/2004, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo