2009-05-04 11 views
3

J'ai une classe, ReportDef, qui est une classe concrète que j'ai décorée avec les attributs [DataContract] et [DataMember] selon les besoins. ReportDef est dans l'assemblage A1 avec mes ServiceContract, IReportService. J'ai alors une autre classe, UiReportDef, qui dérive de ReportDef et est dans l'assemblée A2. UiReportDef n'a aucun état supplémentaire que le service se soucie de.WCF Héritage/Polymorphisme et Sérialisation

Je souhaite appeler mon service avec une instance de UiReportDef. Y a-t-il un moyen (à moins de construire manuellement une instance ReportDef à partir de UiReportDef) pour ce faire sans que mon service soit au courant de A2? Je connais environ KnownType. Je ne veux pas faire référence à A2.


EDIT: Voici est un contexte qui pourrait rendre ma question plus facile à comprendre. Mon ServiceContract implémente IReportService qui définit une méthode, RunReport(ReportDef report). ReportDef est décoré avec l'attribut DataContract et a des membres privés décorés avec DataMember. UiReportDef est dans un assembly qui dépend des assemblages liés à l'interface utilisateur, etc. Je n'ai pas conçu la hiérarchie de classes existante. Je dois passer ReportDefs et UiReportDefs (comme ReportDefs) au nouveau service. Puisque ReportDef est concret, je m'attendrais à ce que le sérialiseur traite UiReportDefs comme ReportDefs en l'absence de toute autre information.

+0

Pour l'instant, j'ajoute un constructeur à la classe de base qui prend une instance de lui-même et copyies l'État concerné. Très moche mais je dois aller de l'avant. – JohnOpincar

Répondre

-3

WCF n'est pas polymorphe car il n'est pas orienté objet. Par conséquent, ce n'est pas possible.

+0

dites wha ??? –

+0

? Pourquoi -1? J'ai répondu à votre question. –

+0

Je n'ai pas noté votre réponse. – JohnOpincar

2

Je n'ai pas compris votre question.

Mais je pense que je comprends une partie de cela maintenant, vous voulez désérialiser un objet dans un assemblage qui ne fait pas référence à lui?

Si oui, vous ne pouvez pas à moins que vous êtes prêt à faire ensemble beaucoup de réflexion et de le garder défini/référencé comme « objet »

La façon courante de faire cela et a essayé d'expliquer dans mon La réponse précédente est que vous devriez utiliser une interface qui peut être référencée par le client/serveur.

Il est de pratique courante de créer des assemblages de tronçon ne comportant que des interfaces pour ce cas. Ou comme votre commentaire sur votre question suggère, vous pouvez utiliser des objets DTO. http://en.wikipedia.org/wiki/Data_Transfer_Object

+0

Cela ne fonctionne pas car le type d'exécution de l'objet est inchangé par un cast. – JohnOpincar

Questions connexes