2013-02-28 2 views
8

Я использую новый ASP.NET WebAPI OData (версия 4.0.0 последней публикации 27/2/2013 согласно NuGet)настройки OData выход из asp.net Web API

В основном я делаю это как описанный здесь: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Я публикую свои объекты передачи данных, и создается канал подачи одата атома, но я бы хотел иметь над ним некоторый контроль. В основном я хотел бы быть в состоянии сделать следующее:

  • решить, что идет по названию, автору и обновленные элементы для подачи
  • решить, будет ли или не иметь редактировать ссылки
  • изменения, что показано в <category term="X" и в m:type в дополнительных свойствах, которые являются классами в моем приложении. В настоящее время они раскрывают имена классов C# с полным пространством имен, но я не хочу раскрывать это.

Спасибо.

+0

Мы сейчас работаем над добавлением перехватчиков расширяемости к ODataMediaTypeFormatter. После этого вы сможете настроить метаданные атома. –

+0

И что касается дополнительных ссылок на редактирование, здесь есть код (рабочий элемент) (http://aspnetwebstack.codeplex.com/workitem/501) –

ответ

11

Формат форматирования носителей OData теперь более расширяемый. Образцы следуют.

1) принимает решение, что идет по названию, автору и обновленных элементам для подачи

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

и зарегистрировать пользовательский поставщик сериализатору использование,

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

2) настроить редактирование ссылки

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

и зарегистрируйте поставщик пользовательских сериализаторов, как указано выше.

Мы по-прежнему не поддерживаем сценарий 3 iимя типов имен имен и пространств имен.

+0

Где находится ODataFeedSerializer. У меня есть последний пакет Nuget для Microsoft ASP.NET Web API OData (v: 4.0.1) Он, похоже, не существует. – cellik

+0

Он должен быть там в наших ночных сборках. Вы можете обратиться к сообщению в блоге Хенрика о том, как использовать наши ночные сборки [здесь] (http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web- стек NuGet-пакеты-с-против-2012-rc.aspx). URL-адрес канала myget: http://www.myget.org/F/aspnetwebstacknightly/ –