2009-09-30 5 views
3

En raison de l'optimisation des performances, je souhaite renvoyer uniquement les propriétés nécessaires. Y at-il une possibilité/solution de contournement? Pseudo/code exemple pour comprendre:WCF: renvoie uniquement les propriétés nécessaires sur json

[DataContract] 
public interface IMemberOverview 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

[DataContract] 
public interface IMemberDetail 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Status { get; set; } 

    [DataMember] 
    public string Infos { get; set; } 
} 

public class Member : IMemberOverview, IMemberDetail 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Status { get; set; } 

    public string Infos { get; set; } 
} 

et le service:

[OperationContract] 
[WebInvoke(
    Method = "GET", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "ListMembers")] 
[KnownType(typeof(Member))] 
public List<IMemberOverview> ListMembers() 
{ 
    return MemberDAO.Instance().GetAll(); 
} 

[OperationContract] 
[WebInvoke(
    Method = "GET", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "Member/{idString}")] 
[KnownType(typeof(Member))] 
public List<IMemberDetail> Member(string idString) 
{ 
    var id = int.Parse(idString); 
    return MemberDAO.Instance().Get(id); 
} 

Répondre

2

Si vous souhaitez exposer une vue différente sur votre modèle d'objet, l'approche la plus simple est simplement d'exposer les données sur un DTO plus mince - c'est-à-dire écrire une seconde classe (généralement dans un espace de noms différent) et traduire les données entre eux. Soit à la main (écrire du code, peut-être un opérateur de conversion statique, qui le fait), soit avec des utilitaires comme PropertyCopy (like so). Avoir un DTO séparé vous permet également d'étendre votre modèle d'objet de base sans impact sur les performances du client, et simplifie considérablement la gestion des versions.

2

Si je comprends bien votre question, [DataMember (EmitDefaultValue = false)] peut vous aider.

Questions connexes