2012-09-27 1 views
0

Je suis nouveau à l'API Web ASP.NET.Comment exposer uniquement les propriétés nécessaires avec l'API Web?

J'ai vu des exemples de la façon dont vous pouvez obtenir et retourner des POCO dans l'application Web RESTful.

Je me demande comment, dans une application réelle, vous ne pouvez transmettre que certaines des propriétés de votre POCO (pour des raisons de sécurité et/ou de taille de message).

J'ai trouvé que je peux utiliser l'attribut '[ScriptIgnore]', mais je cherche un moyen de personnaliser les propriétés à transmettre en fonction du contrôleur demandeur, par exemple.

Y a-t-il un moyen pratique de le faire?

Merci

Répondre

2

Probablement est le plus facile à décorer votre POCO avec System.Runtime.Serialization.DataContractAttribute et les membres que vous voulez inclure avec System.Runtime.Serialization.DataMemberAttribute-à-dire

[DataContract] 
public class MyType 
{ 
    [DataMember] 
    public string Property1 {get; set;} 
    public string Property2 {get; set;} 
    public string Property3 {get; set;} 
} 

Dans ce cas, seul Property1 sera sérialisé. Il est à noter, que les deux XmlMediaTypeFormatter et JsonMediaTypeFormatter respecteront DataContract de sorte que vous n'avez pas besoin d'attrbiutes spécifiques XML/JSON. Maintenant, cela fonctionnera dans des solutions plus simples, pour une approche réelle et bien arrondie, vous aurez probablement besoin de recourir aux DTO au lieu d'exposer vos modèles au client.

Vous pouvez utiliser Automapper pour cela, et les modèles de projet aux DTO - vous avez un bon article d'introduction ici http://www.mono-software.com/blog/post/Mono/120/Using-AutoMapper-to-handle-DTOs/. En outre, avec Automapper vous pouvez avoir différents types de DTO créés à partir du même modèle de base, ce qui, je le comprends, est quelque chose qui vous intéresse.

+1

Je suis d'accord avec la seconde moitié de Filip. Complètement découpler votre domaine de vos ressources et utiliser automapper. – suing

+0

La seconde moitié semble en effet une bonne solution à mon problème. Merci Filip! – Yaniv

0

Si vous essayez de retourner plusieurs manifestations du même modèle différent de contrôleur, il est une conception nocive (selon moi). Si vous voulez toujours le faire, vous pouvez rendre les propriétés indésirables à 'null' et renvoyer le modèle.

Pour gérer les objets null à ignorer de sérialisation que vous avez à faire quelque part lors de la configuration de vos formatteurs (à droite dans global.asax):

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
Questions connexes