2013-02-28 34 views
8

Tôi đang sử dụng OData ASP.NET WebAPI mới (phiên bản 4.0.0 mới nhất được công bố 27/2/2013 theo NuGet)tùy biến đầu ra OData từ api web asp.net

Về cơ bản tôi đang làm nó như được mô tả ở đây: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Tôi đang xuất bản đối tượng chuyển dữ liệu của mình và nguồn cấp dữ liệu pub nguyên tử odata được tạo nhưng tôi muốn kiểm soát nhiều hơn. Chủ yếu là tôi muốn để có thể làm như sau:

  • quyết định những gì diễn ra trên tiêu đề, tác giả và các yếu tố được cập nhật cho thức ăn
  • quyết định có hay không có sự chỉnh sửa liên kết
  • thay đổi gì được hiển thị trong <category term="X" và trong m:type trong thuộc tính phụ là các lớp trong ứng dụng của tôi. Hiện tại, họ trưng ra tên lớp C# với không gian tên đầy đủ nhưng tôi không muốn để lộ điều này.

Cảm ơn.

+0

Chúng tôi đang nghiên cứu thêm các móc mở rộng vào ODataMediaTypeFormatter ngay bây giờ. Bạn sẽ có thể tùy chỉnh siêu dữ liệu nguyên tử sau đó. –

+0

Và liên quan đến các liên kết chỉnh sửa tùy chọn, có một codeplex [mục công việc] (http://aspnetwebstack.codeplex.com/workitem/501) mở cho nó –

Trả lời

11

Trình định dạng kiểu phương tiện OData hiện có thể mở rộng hơn. Mẫu theo.

1) quyết định những gì diễn ra trên tiêu đề, tác giả và các yếu tố được cập nhật cho thức ăn

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

Và đăng ký cung cấp dịch vụ tùy chỉnh serializer sử dụng,

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

2) chỉnh sửa liên kết

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

và đăng ký nhà cung cấp trình nối tiếp tùy chỉnh như trên.

Chúng tôi vẫn không hỗ trợ trường hợp 3, tức là loại tên và không gian tên bí danh.

+0

ODataFeedSerializer ở đâu. Tôi có gói Nuget mới nhất cho Microsoft ASP.NET Web API OData (v: 4.0.1) Nó dường như không có ở đó. – cellik

+0

Nó sẽ có trong bản dựng hàng đêm của chúng tôi. Bạn có thể tham khảo bài đăng trên blog của Henrik về cách sử dụng các bản dựng hàng đêm của chúng tôi [tại đây] (http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web- stack-nuget-packages-với-vs-2012-rc.aspx). URL nguồn cấp dữ liệu của tôi là http://www.myget.org/F/aspnetwebstacknightly/ –

Các vấn đề liên quan