2009-04-06 3 views
1

Ich habe einige Objektklassen, die Vererbung verwenden. Es scheint, dass ich nur auf die Objekte zugreifen kann, die direkt von einem Dienst verwendet werden. Lassen Sie mich Ihnen zeigen, was ich zu erreichen versuchen:Verfügbarmachen von Objekten (DataContracts), die nicht direkt von einem WCF-Dienst verwendet werden können?

[DataContract] 
public class Object1 
{ 
    [DataMember] 
    int Id {get; set;} 
} 

[DataContract] 
public class object2: Object1 
{ 
    [DataMember] 
    string Name {get; set;} 
} 

[DataContract] 
public class object3 
{ 
    [DataMember] 
    int SomeNumber {get; set;} 
} 

Der Service:

public int GetId(object2 obj) 
{ 
    return GetTheId(object2.Name); 
} 

Jetzt, da ich im Dienst bin mit object2, object1 zu serialisiert wird. Trotzdem möchte ich Objekt3 aus irgendeinem Grund verfügbar machen. Es kann eine abgeleitete Klasse sein, die ich übergeben muss, damit ihr Typ später für einen anderen Prozess bestimmt werden kann. Ich sehe nicht, dass dieses Objekt serialisiert wird. Ich nahm an, dass, wann immer Sie den DataContract/DataMember setzen, diese Objekte serialisiert werden würden. Es macht Sinn, etwas nicht zu belichten, das nicht verwendet wird, da ich ein Problem mit dem Aussetzen von Elementen sehen kann, die Sie möglicherweise nicht benötigen. Was ist der beste Weg, um Objekte anzuzeigen, die nicht direkt von einem Dienst verwendet werden? Dank

Daniel

Antwort

1

Sie sollten object2 (eigentümlichen Namen für eine Klasse :)) dekorieren mit dem KnownType attribute:

[DataContract] 
[KnownType(typeof(object3))] 
public class object2 
{ 
} 

Unter der Annahme, meinen Sie Objekt3 eine Unterklasse von object2 ist:

public class object3: object2 
{ 
} 
+0

Ich habe dieses Attribut total vergessen !!! Vielen Dank. Das war es, was ich in dieser Situation brauchte. Vielen Dank!!!!! – DDiVita

+1

Sie können Ihren Servicevertrag auch mit [ServiceKnownType] dekorieren. :) –

-1

Ich glaube, Sie Ihre eigene Frage beantwortet. Wenn die Mitglieder nicht von dem Dienst verwendet werden, sollten Sie sie nicht offen legen. Es ist immer besser, die minimale Menge von Daten verfügbar zu machen, die von dem Dienst benötigt wird, da dies im Allgemeinen die Wartbarkeit des Dienstes erhöht.

+0

Genau, aber was ist der beste Möglichkeit, ein Objekt, das nicht direkt verwendet wird, zu exponieren? – DDiVita

+0

Tun Sie es nicht, ist der beste Weg. Das einzige, was der Client vom Server wissen sollte, sind Objekte, die von Serviceoperationen verwendet werden. –

+0

Dies ignoriert die Tatsache, dass Vererbung in diesen Situationen eine Realität ist. Dies ist sowohl für Verträge, die in Code entworfen wurden, als auch für solche, die im XML-Schema entworfen wurden, eine Realität. Sie müssen "geerbte" Typen definieren, damit der Client eine Definition für diesen Typ haben kann. –

Verwandte Themen