IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

[LINQ & WCF] Petit problème de conception


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut [LINQ & WCF] Petit problème de conception
    Salut,

    Je me pose des questions sur la meilleure façon de faire ce que je veux, d'un point de vue conception... Je fais une appli client-serveur (un système de messagerie instantanée, type MSN) qui utilise WCF pour la communication et LINQ pour modéliser la base de données des utilisateurs.

    Côté serveur, pas de problème, le DataContext est généré par VS et je peux manipuler mes objets comme je veux.

    Maintenant, j'aimerais pouvoir transmettre à un utilisateur connecté des infos sur d'autres utilisateurs. Le plus simple serait donc de simplement envoyer les objets du DataContext, seulement ils contiennent des infos que je ne veux pas transmettre aux utilisateurs. Par exemple, la classe User contient une propriété ContactList, mais je ne veux pas qu'un user A puisse accéder à la contact list d'un utilisateur B.

    Donc, je vois 2 options :

    1.Contrôler la sérialisation pour ne pas sérialiser les infos qui ne doivent pas être transmises
    Avantages : c'est propre, et transparent à l'utilisation
    Inconvénients : je ne suis pas sûr que ce soit possible... j'ai bien vu des méthodes OnSerializing, On Deserializing, etc, mais elles sont générées automatiquement par le Designer, et si je les modifie mes modifs sont écrasées par le designer

    2. Utiliser une autre classe pour transmettre les données sur un utilisateur
    Avantages : c'est simple
    Inconvénients : Je dois créer un nouvel objet à chaque fois au lieu d'utiliser celui qui existe déjà. Et c'est pas beau je n'aime pas trop avoir 2 classes qui représentent la même chose...

    Quelle est à votre avis la meilleure solution (par forcément une de celles que j'ai décrites...) ?
    Pour la solution 1, est-ce qu'il est possible de contourner le problème du designer LINQ qui écrase mes modifs ? (à part en créant le DataContext manuellement bien sûr...)

    Merci pour vos lumières

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je me pose des questions sur la meilleure façon de faire ce que je veux, d'un point de vue conception... Je fais une appli client-serveur (un système de messagerie instantanée, type MSN) qui utilise WCF pour la communication et LINQ pour modéliser la base de données des utilisateurs.
    ça me rappelle quelque chose ce truc

    Au départ mon tuto de chat en WCF devait être un tuto sur messagerie instantanée WCF. Mais j'ai été confronté aux même pb que toi et je suis passé sur un chat parceque c'était plus simple à expliquer .

    Citation Envoyé par tomlev Voir le message
    Quelle est à votre avis la meilleure solution (par forcément une de celles que j'ai décrites...) ?
    la 2 (ce n'est que mon avis)


    Citation Envoyé par tomlev Voir le message
    2. Utiliser une autre classe pour transmettre les données sur un utilisateur
    Avantages : c'est simple
    Inconvénients : Je dois créer un nouvel objet à chaque fois au lieu d'utiliser celui qui existe déjà. Et c'est pas beau je n'aime pas trop avoir 2 classes qui représentent la même chose...
    Oui mais justement (pour moi) ces 2 classes ne représentent pas la même chose. Celle de Linq sert à manipuler les données de ta base, l'autre est la "classe métier coté service" (j'ai un doute sur cette expression ).

    Je ne suis pas un expert mais je pense que c'est une erreur d'utiliser les classes générées par le designer Linq to SQL dans toutes les couches de l'appli. Elles ne doivent servir qu'à communiquer avec la base. Ce ne sont pas tes classes "métier".
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    ça me rappelle quelque chose ce truc
    Contrairement à ce que tu pourrais croire, ce n'est pas ton tuto qui m'a donné cette idée
    C'est simplement le premier truc qui m'est venu à l'esprit quand j'ai voulu essayer WCF... Par contre ce que j'ai lu dans ton tuto m'a permis d'apporter pas mal d'améliorations à ce que j'avais fait

    Bref, je suis parti sur la solution 2... que ce soit ou non la meilleure, c'est la seule que je sache implémenter de toutes façons !

    Merci de ta réponse

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Moi, je conseillerais plutôt la première solution

    Les méthodes OnSerializing, OnDeserializing sont des méthodes partielles (nouveauté C# 3). Cela veut dire qu'elles sont utilisées mais pas déclarées: lors de la compilation, le compilateur voit qu'elles ne sont pas déclarées et donc, il supprime les appels à ces méthodes.

    Le mieux pour toi est de créer, dans un autre fichier, la suite de la classe partielle que représente ton DataContext. Dans ce fichier, tu pourras implémenter les méthodes partielles (tu tapes "partial" et en appuyant sur Espace, l'intellisense de VS te propose la liste des méthodes à implémenter).

    Dans le cas où tu fais des modifs sur ta base/ton DataContext, les méthodes ne sont pas écrasées car elles sont dans un autre fichier. Pour info, c'est la technique à utiliser


    A+

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Moi, je conseillerais plutôt la première solution
    +1

    J'utilise LINQ et WCF dans un projet chez un client, et les objets du datacontext sont utilisés comme objets pauvres, ça simplifie les choses, et les méthodes et classes partielles permettent d'affiner le fonctionnement.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Moi, je conseillerais plutôt la première solution

    Les méthodes OnSerializing, OnDeserializing sont des méthodes partielles (nouveauté C# 3). Cela veut dire qu'elles sont utilisées mais pas déclarées: lors de la compilation, le compilateur voit qu'elles ne sont pas déclarées et donc, il supprime les appels à ces méthodes.

    Le mieux pour toi est de créer, dans un autre fichier, la suite de la classe partielle que représente ton DataContext. Dans ce fichier, tu pourras implémenter les méthodes partielles (tu tapes "partial" et en appuyant sur Espace, l'intellisense de VS te propose la liste des méthodes à implémenter).

    Dans le cas où tu fais des modifs sur ta base/ton DataContext, les méthodes ne sont pas écrasées car elles sont dans un autre fichier. Pour info, c'est la technique à utiliser


    A+
    Ca me plait bien ce que tu me dis là... Je pensais avoir fait le tour des nouveautés du langage, mais j'avais raté ça !

    Par contre ce qui m'embête, c'est que chez moi, les méthodes en question ne sont pas déclarées comme partielles et elles sont déjà implémentées par le designer
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [OnSerializing()]
    [System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Never)]
    public void OnSerializing(StreamingContext context)
    {
        this.serializing = true;
    }

    Est-ce qu'il y a quelque chose de spécial à faire pour obtenir le comportement que tu décris ?

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tu utilises quelle version de VS 2008 ?
    Tu as bien défini le SerializationMode à Unidirectional dans le fichier dbml ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit problème de conception
    Par themadmax dans le forum ALM
    Réponses: 6
    Dernier message: 11/10/2011, 15h40
  2. [PHP 5.2] [POO] Petit problème de conception
    Par grunk dans le forum Langage
    Réponses: 5
    Dernier message: 16/02/2011, 11h06
  3. Petit problème de conception
    Par Falcor dans le forum UML
    Réponses: 2
    Dernier message: 13/12/2009, 12h36
  4. Un petit problème de conception du code
    Par diamonds dans le forum NetBeans
    Réponses: 2
    Dernier message: 27/02/2007, 16h40
  5. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24

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