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

Framework .NET Discussion :

[VS2005] Références Web "croisées"


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut [VS2005] Références Web "croisées"
    Bonjour tout le monde,

    Mon problème concerne les références Web, dans des projets sous VS 2005.

    Mise en situation :
    Mon programme doit consommer 2 WebServices, donc on me fournit les WSDL:
    - le premier (appelons-le WS_Get) prend en Input un identifiant, et me renvoie un objet "Utilisateur" avec toutes ses infos (identifiant, nom, adresse...)
    - le second (WS_Sync) prend en Input un objet "Utilisateur", et le met à jour dans le SI.

    Je rajoute donc 2 références Web au projet, à partir des WSDL.

    Le problème est que ça me crée la classe Utilisateur dans 2 namespaces différents (1 par référence web). Et je ne peux donc pas utiliser mon objet Utilisateur renvoyé par le WS_Get comme paramètre d'appel du WS_Sync, l'erreur obtenue étant
    Impossible de convertir implicitement le type 'WS_Get.Utilisateur' en 'WS_Sync.Utilisateur'
    .

    Pour contourner le problème, j'ai donc essayé plusieurs idées :

    1) Récupérer les fichiers Reference.cs, changer les namespaces, et supprimer les déclarations en double.
    Inconvénients : c'est assez lourd (car j'ai en fait une 20aine de WS différents à utiliser), et je ne peux plus mettre à jour les références Web sans avoir à tout refaire.

    2) Créer une méthode "Copie(object o, Type typeDestination)" basée sur de la réflection qui permet de passer d'un type à un autre, utilisable par exemple en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WS_Get.Utilisateur u;
    (WS_Sync.Utilisateur)Copie(u, typeof(WS_Sync.Utilisateur));
    Problème : c'est une usine à gaz à code, et je ne suis pas sûr qu'au niveau perf, ça soit tip-top.

    L'un d'entre vous a-t-il déjà été confronté à ce type de problème et/ou aurait une idée pour le contourner ?

    N'hésitez pas à demander si vous voulez + d'informations.

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Le mieux est que tes classes existent dans 3 namespaces differents
    -1 pour une utilisation en interne
    -1 pour chaque webservice
    Ainsi il faut implémenter du côté de tes 2 classes dans les namespaces pour les webservices des convertisseurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    namespace Appli1.Internal
    {
    public class MyObject
    {}
    }
     
    namespace Appli1.WS1
    {
    public class MyObject
    {
    public Internal.MyObject ToInternal()
    {//content}
    public static MyObject FromInternal(Internal.MyObject object)
    {//content}
    }
    }
     
     
    namespace Appli1.WS2
    {
    public class MyObject
    {
    public Internal.MyObject ToInternal()
    {//content}
    public static MyObject FromInternal(Internal.MyObject object)
    {//content}
    }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    Merci pour ta solution qui est en effet propre, et qui pourrait se faire très facilement pour les WS que j'ai cités en exemple (simplifiés à l'extrême pour faciliter la compréhension).

    En réalité chacun de la 20aine de WS que j'utilise comporte une 30aine de classes différentes, donc ça fait beaucoup de convertisseurs (+ ou - 600) à coder à la mimine, ce qui rend la tâche quasi-impossible.

    Une autre idée ?

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Malheureusement pas sur qu'il soit possible de faire mieux (c'est un architecte confirmé qui avait mis en place ca sur un projet sur lequel je travaillais)

    Edit:
    Peut être une idée: tous tes objets implémentent une interface vide IMonInterface
    Apres tu peux peut-être créer une méthode d'extension générique pour les objets implémentant IMonInterface et qui convertit grace à la reflection. Mais ca me parait bidouille et pas performant

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    Finalement, j'ai trouvé une méthode qui convient plutôt bien à mon besoin, et que voici (ça pourra peut-être servir à quelqu'un d'autre) :

    J'ai créé un projet qui ne me sert qu'à générer les fichiers dont j'ai besoin, et dans lequel j'ajoute toutes mes références Web.

    Ensuite, je récupère tous les ".xsd" et ".wsdl" de mes dossiers webreferences (sur le disque) et je les regroupe dans un dossier quelconque.

    Je prends ensuite le contenu des fichiers Reference.map que je concatène dans un fichier "References.discomap", dans le répertoire précédemment évoqué.

    Il ne me reste plus qu'à utiliser l'exécutable "wsdl.exe" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe" /nologo /n:MyWS /out:WebReferences.cs /language:CS "References.discomap"
    J'obtiens un fichier "WebReferences.cs" que je n'ai plus qu'à ajouter à mon vrai projet. Tous mes objets sont créés dans un namespace unique "MyWS".

    Merci quand même pour avoir partagé tes idées, qui sont correctes dans l'absolu, mais qui ne convenaient pas à mon cas particulier !

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

Discussions similaires

  1. [VS2005][WS]Créer une référence web dynamique
    Par virgul dans le forum Visual Studio
    Réponses: 5
    Dernier message: 24/08/2006, 16h16

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