2013-02-28 14 views
8

Ich bin den neuen ASP.NET WebAPI OData (Version 4.0.0 zuletzt veröffentlichte 27/2/2013 nach Nuget)Anpassen OData Ausgabe von asp.net web api

Im Grunde ist es ich tue als hier beschrieben: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Ich veröffentliche meine Datenübertragungsobjekte und der ODATA-Atom-Pub-Feed wird erstellt, aber ich hätte gerne mehr Kontrolle darüber. Vor allem würde Ich mag zu können, wie folgt vorgehen:

  • entscheiden, was auf den Titel geht, Autor und aktualisierten Elemente für den Feed
  • entscheiden, ob die Bearbeitung haben, verbindet
  • ändern, was wird in <category term="X" und in m:type in Untereigenschaften angezeigt, die Klassen in meiner Anwendung sind. Derzeit stellen sie die C# -Klassennamen mit dem vollständigen Namespace aus, aber ich möchte dies nicht offen legen.

Danke.

+0

Wir arbeiten gerade an dem Hinzufügen von Extensiblity-Hooks zum ODataMediaTypeFormatter. Sie sollten danach die Atom-Metadaten anpassen können. –

+0

Und in Bezug auf die optionalen Bearbeitungslinks gibt es einen Codeplex [Workitem] (http://aspnetwebstack.codeplex.com/workitem/501) geöffnet –

Antwort

11

Der OData-Medientyp-Formatierer ist jetzt erweiterbarer. Proben folgen.

1) entscheiden, was auf dem Titel, Autor und aktualisierten Elemente für den Feed

public class AtomMetadataFeedSerializer : ODataFeedSerializer 
{ 
    public AtomMetadataFeedSerializer(IEdmCollectionTypeReference edmType, ODataSerializerProvider serializerProvider) 
     : base(edmType, serializerProvider) 
    { 
    } 

    public override ODataFeed CreateODataFeed(IEnumerable feedInstance, ODataSerializerContext writeContext) 
    { 
     ODataFeed feed = base.CreateODataFeed(feedInstance, writeContext); 
     feed.Atom().Title = new AtomTextConstruct { Kind = AtomTextConstructKind.Text, Text = "My Awesome Feed" }; 
     return feed; 
    } 
} 

public class CustomSerializerProvider : DefaultODataSerializerProvider 
{ 
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType) 
    { 
     if (edmType.IsCollection() && edmType.AsCollection().ElementType().IsEntity()) 
     { 
      // feed serializer 
      return new AtomMetadataFeedSerializer(edmType.AsCollection(), this); 
     } 

     return base.CreateEdmTypeSerializer(edmType); 
    } 
} 

und registriert den benutzerdefinierten Serializer Provider,

config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create(new CustomSerializerProvider(), new DefaultODataDeserializerProvider())); 

2) anpassen Links

bearbeiten geht
public class CustomEntityTypeSerializer : ODataEntityTypeSerializer 
{ 
    public CustomEntityTypeSerializer(IEdmEntityTypeReference edmType, ODataSerializerProvider serializerProvider) 
     : base(edmType, serializerProvider) 
    { 
    } 

    public override ODataEntry CreateEntry(EntityInstanceContext entityInstanceContext, ODataSerializerContext writeContext) 
    { 
     ODataEntry entry = base.CreateEntry(entityInstanceContext, writeContext); 
     if (notProduceEditLinks) 
     { 
      entry.EditLink = null; 
     } 

     return entry; 
    } 
} 

public class CustomSerializerProvider : DefaultODataSerializerProvider 
{ 
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType) 
    { 
     if (edmType.IsEntity()) 
     { 
      // entity type serializer 
      return new CustomEntityTypeSerializer(edmType.AsEntity(), this); 
     } 

     return base.CreateEdmTypeSerializer(edmType); 
    } 
} 

und registrieren Sie den benutzerdefinierten Serialisierungsanbieter wie oben.

Wir unterstützen immer noch nicht Szenario 3, d. H. Alias-Typ-Namen und Namespaces.

+0

Wo ist ODataFeedSerializer. Ich habe das neueste Nuget-Paket für Microsoft ASP.NET-Web-API-OData (v: 4.0.1) Es scheint nicht zu sein. – cellik

+0

Es sollte in unseren nächtlichen Builds sein. Sie können sich auf Henriks Blog-Post beziehen, um zu erfahren, wie Sie unsere nächtlichen Builds [hier] verwenden können (http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web- Stack-Nuget-Pakete-mit-vs-2012-rc.aspx). Die Myget-Feed-URL lautet http://www.myget.org/F/aspnetwebstacknightly/ –