2013-02-28 19 views
8

Używam nowy ASP.NET WebAPI OData (wersja 4.0.0 ostatni opublikowany 27/2/2013 według Nuget)dostosowywania OData wyjście z asp.net Web API

zasadzie robię to jako opisałem tutaj: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Publikuję moje obiekty do przesyłania danych i tworzony jest kanał publikacji odata atomu, ale chciałbym mieć nad nim większą kontrolę. Przede wszystkim chciałbym, aby móc wykonać następujące czynności:

  • zdecydować, co dzieje się na tytuł, autora i zaktualizowanych elementów do paszy
  • zdecydować, czy mają zmienił linki
  • zmianę co jest pokazany w <category term="X" i m:type we właściwościach podrzędnych, które są klasami w mojej aplikacji. Obecnie wystawiają one nazwy klas C# z pełnym obszarem nazw, ale nie chcę tego ujawniać.

Dzięki.

+0

Pracujemy nad dodaniem haczyków extensiblity do ODataMediaTypeFormatter już teraz. Powinieneś być w stanie dostosować metadane atomu po tym. –

+0

Co do opcjonalnych łączy do edycji, istnieje kodeks pracy [element pracy] (http://aspnetwebstack.codeplex.com/workitem/501) otwarty dla niego –

Odpowiedz

11

Formater formatów mediów OData jest teraz bardziej rozszerzalny. Próbki są następujące.

1) decyduje to, co dzieje się na tytuł, autora i zaktualizowanych elementów do paszy

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); 
    } 
} 

i zarejestrować dostawcę zwyczaj serializer stosując

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

2) dostosować edit linki

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); 
    } 
} 

i zarejestruj dostawcę niestandardowego serializera, jak powyżej.

Wciąż nie obsługujemy scenariusza 3, tj. Aliasingu nazw typów i przestrzeni nazw.

+0

Gdzie jest ODataFeedSerializer. Mam najnowszy pakiet Nuget dla Microsoft ASP.NET Web API OData (v: 4.0.1) Wydaje się, że tam nie jest. – cellik

+0

Powinien tam być w naszych nocnych kompilacjach. Możesz zajrzeć do posta na blogu Henrika o tym, jak korzystać z naszych nocnych buildów [tutaj] (http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web- stack-nuget-packages-with-vs-2012-rc.aspx). Adres URL mojego adresu URL to http://www.myget.org/F/aspnetwebstacknightly/ –