2013-02-28 6 views
8
나는 새 ASP.NET webapi의 하나로, OData를 사용하고

(Nuget에 따라 버전 4.0.0 마지막으로 게시 27/2/2013) 기본적으로사용자 정의 중 하나로, OData 출력

여기에 설명되어 있습니다 : http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

데이터 전송 개체를 게시 중이며 odata atom pub 피드가 생성되었지만이를 좀 더 제어하고 싶습니다. 주로 다음 작업을 수행 할 수 있도록하고 싶습니다 :

  • 피드
  • 의 제목, 저자 및 업데이트 요소에 어떤 일이 일어나는지를 결정 편집을 여부를 결정
  • 변화를 링크 무엇 내 응용 프로그램의 하위 속성 인 <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); 
    } 
} 

위와 같이 사용자 지정 serializer 공급자를 등록하십시오.

우리는 여전히 시나리오 3, 즉 별칭 유형 이름과 네임 스페이스를 지원하지 않습니다.

+0

ODataFeedSerializer는 어디에 있습니까? Microsoft ASP.NET 웹 API OData (v : 4.0.1) 용 최신 Nuget 패키지가 있습니다. 거기에없는 것 같습니다. – cellik

+0

야간 빌드에 있어야합니다. 야간 빌드를 사용하는 방법에 대한 Henrik의 블로그 게시물을 참조 할 수 있습니다 (http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web- stack-nuget-packages-with-vs-2012-rc.aspx). myget 피드 url은 http://www.myget.org/F/aspnetwebstacknightly/입니다. –

관련 문제