Ajout de références de service à plusieurs services WCF partageant des classes

J’essaie de scinder mes services Web WCF en quelques services au lieu d’un service géant. Mais Visual Studio (client Silverlight) duplique les classes communes partagées par les deux services. Voici un exemple simple pour illustrer mon problème.

Dans cet exemple, il existe deux services. Les deux renvoient le type “Personne”. Par défaut, VS créera deux serveurs mandataires distincts sous des espaces de noms uniques. Cela signifie que la “personne” renvoyée par les différents services ne peut pas être consommée par le client comme étant la même chose. Comment puis-je réparer ça? Est-ce possible sans écrire les classes proxy moi-même?

Commun

[DataContract] public class Person { [DataMember] ssortingng FirstName { get; set; } [DataMember] ssortingng LastName { get; set; } [DataMember] ssortingng PrivateData { get; set; } } 

StaffService.svc

 [ServiceContract(Namespace = "")] public class StaffService { [OperationContract] public Person GetPerson () { return new Person {"John", "Doe", "secret"}; }; } 

PublicService.svc

 [ServiceContract(Namespace = "")] public class PublicService { [OperationContract] public Person GetPerson () { return new Person {"John", "Doe", "*****"}; }; } 

Merci pour ton aide! Justin

Il existe une case à cocher dans la section Avancé de “Ajouter une référence de service” intitulée “Réutiliser les types dans les assemblys référencés”. Cela recherchera les types utilisés dans votre service et s’ils existent déjà dans un assemblage référencé, ils seront utilisés plutôt qu’une classe de proxy générée.

Une mise en garde ici est que ce ne sont que les “assemblys référencés” qui sont recherchés, de sorte que les mandataires générés par d’autres services ne sont pas capturés (et je pense que les différents espaces de noms l’arrêteraient également).

J’ai généralement un projet d’entreprise / de domaine dans mon projet Silverlight, donc j’y ajoute mes classes partagées (généralement avec “Ajouter un élément existant”> “Ajouter en tant que lien” pour que le code soit partagé).

Une fois que cela est fait, vous pouvez générer vos références de service et ils devraient choisir vos types existants.

J’espère que cela t’aides

Si vous générez les mandataires en même temps à l’aide de svcutil.exe, un seul type sera généré. Je ne sais pas comment faire cela en ajoutant une référence de service au projet.

Nous l’exécutons dans un fichier de commandes, j’ai donc coupé cela et modifié les noms pour protéger les innocents. Il s’agit vraiment de mapper les espaces de noms de service ensemble, puis d’ inclure toutes les URL ensemble . Il contient également le type de collection défini (pour les listes) et inclut une référence d’assemblage (à laquelle certaines des autres réponses font référence.

 @ECHO OFF SET cmd=C:\"Program Files"\"Microsoft SDKs"\Windows\v6.0a\bin\SvcUtil.exe SET cmd=%cmd% /out:Traffic.cs /noConfig /collectionType:System.Collections.Generic.List`1 SET cmd=%cmd% /reference:..\..\..\lib\Architecture.Frameworks.dll REM ######### Service namespace mappings (Service Contracts and Message Contracts) SET cmd=%cmd% /namespace:"http://services.test.com/app/2005/09/" SET cmd=%cmd%,"app.ServiceProxies" REM ######### Schema namespace mappings (Data Contracts) SET cmd=%cmd% /namespace:"http://schemas.company.com/app/2005/09/" SET cmd=%cmd%,"Co.ServiceProxies.app.DataContracts" REM ######### Set all the URLs that have common types SET cmd=%cmd% http://localhost/Services/MyService1.svc SET cmd=%cmd% http://localhost/Services/MyService2.svc %cmd% PAUSE 

Si tous les éléments se trouvent dans le même espace de noms de services, vous pouvez vous en tirer simplement en affichant toutes les URL sans vous soucier des espaces de noms, mais je ne l’ai pas essayé de cette façon.

svcutil.exe peut réutiliser des types des assemblys spécifiés. Vous pouvez le configurer en définissant les propriétés de référence du service ou par la clé / reference si vous exécutez manuellement svcutil.exe.

Si vous êtes le propriétaire des services mentionnés, envisagez de placer les types de données tels que la classe Personne dans un ensemble séparé, disponible à la fois auprès du client et du service.