2010-05-20 6 views
2

J'utilise un service WCF dans mon projet. Ce service renvoie une classe appelée "Store". J'ai créé une nouvelle classe locale qui hérite de "Store". Ma classe s'appelle "ExtendedStore". Mon ExtendedStore ressemble à ceci:Comment étendre WCF renvoyé classe correctement?

class ExtendedStore : StoreManagerService.Store 
{ 
    public int Id; 
    .... 
} 

Maintenant, je suis en utilisant le service WCF pour lancer ma classe en utilisant le code suivant:

StoreManagerService.StoreClient client = new StoreManagerService.StoreClient(); 
ExtendedStore store = (ExtendedStore) client.GetStore(); // bombs here 

Je ne suis pas en mesure de lancer la retour de classe de magasin de la service à ma classe ExtendedStore. Je reçois le message d'erreur ci-dessous:

Impossible de jeter l'objet de type 'ConsoleApplication1.StoreManagerService.Store' taper 'ConsoleApplication1.ExtendedStore'.

Ne devrais-je pas être capable de le lancer? Si non, y a-t-il une solution de contournement?

Répondre

11

Vous ne devez pas hériter d'un type de proxy renvoyé par WCF. Considérez que le type ne vous appartient pas!

Vous pouvez effectuer une "extension" en utilisant la fonction de classe partielle de C#, car les classes de proxy sont générées en tant que classes partielles. Au lieu de créer la classe ExtendedStore avec la propriété Id, essayez:

public partial class Store 
{ 
    public int Id {get;set;} 
} 

Cela ajoute une propriété à la classe Id Store. Vous pouvez également ajouter des événements de méthodes, etc. de cette manière.

La classe partielle devra être définie dans le même projet qui contient la référence de service.


Considérons un projet avec l'espace de noms racine "Projet". Vous avez une référence de service nommée "Commerce" à un service Web qui renvoie un objet "Store". Cela signifie qu'il ya une classe nommée Project.Commerce.Store:

// Proxy code generated by "Add Service Reference": 
namespace Project.Commerce { 
    [DataContract] 
    public partial class Store { 
     [DataMember] 
     public string StoreName {get;set;} 
     // More data members here 
    } 
} 

Vous allez créer un dossier sous la racine de votre projet intitulé « Commerce ». C'est ainsi que les espaces de noms des classes que vous créez là seront "Project.Commerce". Ensuite, créez votre classe partielle:

// This is your code in Store.cs in the new "Commerce" folder: 
namespace Project.Commerce { 
    public partial class Store { 
     public int Id {get;set;} 
     public override string ToString() { 
      return String.Format("Store #{0}: {1}", Id, StoreName); 
     } 
    } 
} 
+0

Probablement la solution la plus simple, s'il génère réellement un proxy. Je trouve un peu étrange que vous ayez un problème avec l'héritage, mais pas avec l'extension de la classe à travers le mécanisme de classe partielle. Les raisons de ne pas hériter de la classe sont également valables pour s'étendre de cette façon, imo. – Thorarin

+0

Comment utiliser cette classe partielle maintenant? – vikasde

+0

Merci pour l'aide. – vikasde

5

Vérifiez le contrat de données KnownTypes il vous donne la possibilité de travailler avec l'héritage. Principalement vous donne la possibilité d'assigner l'objet de la classe dérivée à l'objet de la classe parent et plus encore ... Vérifiez KnownType et ServiceKnownType cela vous aidera.

+2

Voir aussi http://stackoverflow.com/questions/560218/wcf-configuring-known-types sur la façon de le faire uniquement dans la configuration App.config. Cela serait nécessaire si vous ne pouvez pas changer 'StoreManagerService.Store' ou fournir' ServiceKnownType' dans le contrat de service. – Thorarin

2

Il semble que vous essayez de faire l'équivalent de:

BaseType client = new BaseType(); 
DerivedType store = (DerivedType) client.GetStore(); 

Vous convertir en un type plus dérivé, au lieu de un type moins dérivé. Cela ne marcherait jamais.

+0

Oh ... je n'ai pas pensé à ça. Merci:/ – vikasde

+0

@Thorarin: son exemple ne marchera jamais. En effet, c'est un exemple de client retournant un 'Store', et non un' ExtendedStore'. Dans le cas de l'OP, le service ne retournera jamais un 'ExtendedStore'. –

+0

@John Saunders: Il semble probable de l'histoire autour du code, mais il n'y a pas de code qui montre réellement ce qu'il retourne :) – Thorarin

Questions connexes