2009-03-18 4 views
5

Ich habe zwei Objekte, eines ist in unserer Unternehmensebene und ein anderes in unserem Service-Level. Das Serviceobjekt erbt vom Unternehmen. Hier ist ein kurzes Beispiel:WCF-Serialisierung mit Objektvererbung?

[DataContract] 
public class EnterpriseObject{ 
    [DataMember] 
    int ID{get; set;} 

    string InternalUse{get; set;} 
} 

[DataContract] 
public class ServiceObject: EnterpriseBaseObject{ 
    [DataMember]  
    string Address{get; set;} 
} 

Ist es möglich, nur die ServiceObject aussetzen (mit vererbten Eigenschaften von EnterpriseObject) in der Serialisierung? Ich möchte nicht, dass der Client das Enterprise-Objekt als Option aufgeführt sieht? Wie Sie im Beispiel sehen können, ist das DataMember-Attribut nicht für die InternalUser-Eigenschaft festgelegt. Ist das der einzige Weg? Danke

Antwort

7

Sie handhaben Vererbung, indem Sie [KnownType(typeof(ServiceObject))] zu EnterpriseBaseObject hinzufügen - jedoch ist der EnterpriseBaseObject noch Teil des Vertrags, und seine Existenz wird öffentlich sein. Es werden jedoch nur die mit [DataMember] gekennzeichneten Mitglieder veröffentlicht.

Eine Option (um die Vererbung zu entfernen) besteht darin, einen separaten DTO für Serialisierungszwecke zu haben und eine Konvertierung zwischen der DTO-Version und der tatsächlichen Version zu haben - aber das macht zusätzliche Arbeit.

+0

Dies half A LOT! – Slavo

2

Können Sie dies von einem Is A-Muster zu einem Has A-Muster ändern? Wenn ServiceObject über ein EnterpriseObject verfügt, können Sie nur die Eigenschaften anzeigen, die Sie benötigen.

bearbeiten

Wenn ich das richtig verstanden, Sie ServiceObject Kunden einschließlich aller seiner Eigenschaften verfügbar machen möchten (das als Datamember) gekennzeichnet sind, einschließlich Eigenschaften von EnterpriseObject geerbt. Aber Sie möchten nicht, dass der Client weiß, dass es ein Objekt namens EnterpriseObject gibt.

Sie können dies tun, indem Sie die Tatsache verbergen, dass es ein Unternehmensobjekt gibt. Anstatt eine "Is A" -Beziehung zu verwenden, die ein Vererbungsmuster ist. Sie können eine Komposition oder ein "Has A" -Muster verwenden.

Jetzt haben Sie Ihr EnterpriseObject von Ihrem Client isoliert. Alles, was Sie kommunizieren, ist, dass ServiceObject über einige Eigenschaften verfügt, die Sie Ihrem Client nicht offen legen, dass dies von einem anderen Objekt auf dem Server implementiert wird.

Dies ist auch similar zu einem DTO, das ein Objekt ist, dessen einziger Zweck es ist, Daten zu übertragen. Mithilfe von DTOs können Sie Ihre Implementierung verbergen, indem Sie Ihren Kunden genau das geben, was sie benötigen, und zwar in dem Format, das sie benötigen, ohne Ihre internen Objekte freizulegen.

+0

Nicht sicher, was du hier meinst. Könntest du erklären? – DDiVita

+0

Ich sehe was du sagst. Das ist ein interessanter Ansatz! Vielen Dank! – DDiVita