2009-03-18 20 views
5

Ho due oggetti, uno è nel nostro livello aziendale e un altro nel nostro livello di servizio. L'oggetto servizio eredita dall'azienda. Ecco un rapido esempio:Serializzazione WCF con ereditarietà degli oggetti?

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

    string InternalUse{get; set;} 
} 

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

E 'possibile solo esporre il ServiceObject (con proprietà ereditate dal EnterpriseObject) nella serializzazione? Non voglio che il client veda l'oggetto aziendale elencato come un'opzione? Come puoi vedere nell'esempio, l'attributo DataMember non è impostato per la proprietà InternalUser. È l'unico modo per farlo? Grazie

risposta

7

È possibile gestire l'ereditarietà aggiungendo un [KnownType(typeof(ServiceObject))] a EnterpriseBaseObject - tuttavia, lo EnterpriseBaseObject è ancora parte del contratto e la sua esistenza sarà pubblica. Ma solo i membri contrassegnati [DataMember] saranno pubblicati.

Un'opzione (per rimuovere l'ereditarietà) deve avere un DTO separato per scopi di serializzazione e avere una conversione tra la versione DTO e la versione effettiva, ma ciò rende più lavoro.

+0

Questo ha aiutato MOLTO! – Slavo

2

È possibile modificare questo da un È un modello a un ha un modello? Se ServiceObject ha un oggetto Enterprise, è possibile esporre solo le proprietà necessarie.

Modifica

Se ho capito bene si desidera esporre ServiceObject ai clienti, tra cui tutte le sue proprietà (che sono contrassegnate come DataMember) incluse le proprietà ereditate dal EnterpriseObject. Ma non vuoi che il client sappia che esiste un oggetto chiamato EnterpriseObject.

È possibile farlo nascondendo il fatto che esiste un oggetto aziendale. Invece di usare una relazione "Is A" che è un modello di ereditarietà. Puoi usare una composizione o un pattern "Has A".

public class ServiceObject 
{ 
    private EnterpriseObject _myEntObject; 

    public string MyServiceObjectProperty 
    { 
     get; 
     set; 
    } 

    public string MyEntObjectProperty 
    { 
    get { return _myEntObject.MyEntObjectProperty;} 
    } 
} 

Ora hai isolato il tuo EnterpriseObject dal tuo cliente. Tutto il tuo comunicare è che ServiceObject ha alcune proprietà che non stai esponendo al tuo cliente che questo è implementato sul server da qualche altro oggetto.

Questo è anche simile a un DTO, che è un oggetto il cui unico scopo è quello di trasmettere dati. Le DTO ti consentono di nascondere la tua implementazione dando ai tuoi clienti esattamente ciò di cui hanno bisogno nel formato di cui hanno bisogno, senza esporre i tuoi oggetti interni.

+0

Non sai cosa intendi qui. Potresti spiegare? – DDiVita

+0

Vedo quello che stai dicendo. Questo è un approccio interessante! Grazie! – DDiVita

Problemi correlati