2009-05-14 8 views
0

Est-il possible de passer des objets génériques (par générique je veux dire tout avec DataContract, pas de collection générique C#) sans hériter d'une racine? En ce moment j'ai quelque chose comme ceci:Comment passer un objet générique via WCF

[OperationContract] 
void Save(GenericObject o); 

[DataContract] 
[KnownType(typeof(ClassA))] 
[KnownType(typeof(ClassB))] 
class GenericObject {.... 

[DataContract] 
class ClassA: GenericObject {.... 


[DataContract] 
class ClassB: GenericObject {.... 

Tout était OK, mais le projet a obtenu plus grand et je ne peux pas vraiment se permettre de tirer tous les contrats d'une classe.

Je ne souhaite pas ajouter de méthodes spécialisées au service. En guise de solution de contournement, je peux sérialiser manuellement les classes en chaîne ou en octet [] via DataContractSerializer et les désérialiser du côté serveur: void Save (byte [] serializedObject) mais c'est un peu un hack.

J'ai remarqué que je peux facilement retourner des objets génériques, par ex. objet Load (chaîne ID) fonctionne très bien, mais void Enregistrer (objet o) ne fonctionne pas. J'utilise Silverlight en tant que client.

+0

Vous avez une réponse ci-dessous. Si vous voulez plus d'informations, il pourrait être utile d'avoir un aperçu de ClassA, ClassB et de ce à quoi ressemble votre GenericObject. Et pourquoi vous voulez passer des objets génériques plutôt que ClassA/B/C etc. – Cheeso

+0

Je veux passer des objets génériques car j'ai une vaste collection d'objets (ClassA/B/C) qui sont stockés dans un système de fichiers virtuel créé au dessus de la base de données. Par conséquent, j'utilise deux méthodes pour les stocker/récupérer: Save()/Load() et non SaveClassA/SaveClassB/SaveClassC avec exactement la même signature (en dehors de type). –

Répondre

1

Oui, vous pouvez utiliser un type générique Message pour les projets WCF, ce qui peut être quelque chose, vraiment. Cependant, cela impose beaucoup de travail sur vous, à la fois côté client créant l'objet message (vous devez essentiellement créer manuellement le XML qui compose le message générique), ainsi que côté serveur, car vous ne pouvez pas compter sur la bonne sérialisation/désérialisation XML. Vous avez affaire à une soupe de base à angle droit (rectiligne XML).

Cela fonctionne et cela pourrait être une solution - mais peut-être y en a-t-il d'autres, des solutions plus élégantes et utiles? Cet héritage est-il vraiment nécessaire? Pensez à la conception de votre système.

Marc

+0

Non, l'héritage est absolument inutile - son seul but était de fournir une solution de contournement pour passer des objets génériques au service de stockage. Mais depuis que le projet a pris de l'ampleur, nous ne pouvons pas vraiment nous permettre d'hériter de la plupart de nos objets DataContract à partir de la racine unique. –

+0

marc_s est correct. La réception d'un type de message vous permettrait d'utiliser n'importe quel type, indépendamment de l'héritage. Je suis également d'accord que vous pourriez penser à la raison pour laquelle vous utilisez un service WCF ici. Si vous ne faites que déplacer votre couche d'accès aux données vers un service WCF, il vous manque le point. –

Questions connexes