2009-03-18 5 views
5

J'ai deux objets, un dans notre niveau d'entreprise et un autre dans notre niveau de service. L'objet de service hérite de l'entreprise. Voici un exemple rapide:WCF Sérialisation avec héritage d'objet?

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

    string InternalUse{get; set;} 
} 

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

Est-il possible de n'exposer le ServiceObject (avec des propriétés héritées de EnterpriseObject) dans la sérialisation? Je ne veux pas que le client voit l'objet d'entreprise répertorié comme une option? Comme vous pouvez le voir dans l'exemple, l'attribut DataMember n'est pas défini pour la propriété InternalUser. Est-ce la seule façon de le faire? Merci

Répondre

7

Vous gérez l'héritage en ajoutant un [KnownType(typeof(ServiceObject))] à EnterpriseBaseObject - cependant, le EnterpriseBaseObject fait toujours partie du contrat et son existence sera publique. Mais seuls les membres marqués [DataMember] seront publiés. Une option (pour supprimer l'héritage) est d'avoir un DTO séparé à des fins de sérialisation, et d'avoir une conversion entre la version DTO et la version actuelle - mais cela fait un travail supplémentaire.

+0

Cela a aidé BEAUCOUP! – Slavo

2

Pouvez-vous changer cela d'un modèle Is A à un modèle Has A? Si ServiceObject a un objet EnterpriseObject, vous pouvez alors exposer uniquement les propriétés dont vous avez besoin.

Modifier

Si je comprends bien, vous voulez exposer ServiceObject aux clients, y compris toutes ses propriétés (qui sont marquées comme DataMember) y compris les propriétés héritées de EnterpriseObject. Mais vous ne voulez pas que le client sache qu'il existe un objet appelé EnterpriseObject.

Vous pouvez le faire en cachant le fait qu'il existe un objet d'entreprise. Au lieu d'utiliser une relation "Is A" qui est un modèle d'héritage. Vous pouvez utiliser une composition ou un motif "A".

public class ServiceObject 
{ 
    private EnterpriseObject _myEntObject; 

    public string MyServiceObjectProperty 
    { 
     get; 
     set; 
    } 

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

Maintenant, vous avez isolé votre EnterpriseObject de votre client. Tout ce que vous communiquez est que ServiceObject a des propriétés que vous n'exposez pas à votre client que cela soit implémenté sur le serveur par un autre objet.

Ceci est également similaire à un DTO, qui est un objet dont le seul but est de transmettre des données. Les DTO vous permettent de cacher votre implémentation en donnant à vos clients exactement ce dont ils ont besoin dans le format dont ils ont besoin, sans exposer vos objets internes.

+0

Je ne sais pas ce que vous voulez dire ici. Pourriez-vous expliquer? – DDiVita

+0

Je vois ce que vous dites. C'est une approche intéressante! Merci! – DDiVita