2017-10-17 8 views
0

ODataでシリアル化されるモデルに属性を設定し、それに基づいてシリアル化することを選択できますか?Odata 4 - ODataResourceSerializerのカスタム属性に基づいてプロパティをシリアル化する方法

ODataResourceSerializerを正常に拡張し、CreateStructuralPropertyをオーバーライドしました。これにより、プロパティの名前をチェックし、それをシリアル化するかどうかを選択することができます。

ここには、私が設定したもの(動作しているもの)の要約があります。私はスタートアップでサービスを登録していますこれはどこ...

private static void ConfigureODataServices(IContainerBuilder builder) 
    { 
     // add custom odata serializer 
     builder.AddService<ODataSerializerProvider>(Singleton, s => new CustomODataSerializerProvider(s)); 
    } 

されており、ここで私は現在、ちょうどこのプロパティをシリアル化するかどうかを選択するために、プロパティ名を使用しています私のカスタムフォーマッタは、です:

public class CustomODataSerializerProvider : DefaultODataSerializerProvider 
{ 
    private AnnotatingEntitySerializer _annotatingEntitySerializer; 

    public CustomODataSerializerProvider(IServiceProvider container) : base(container) 
    { 
     _annotatingEntitySerializer = new AnnotatingEntitySerializer(this); 
    } 

    public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType) 
    { 
     if (edmType.Definition.TypeKind == EdmTypeKind.Entity) 
      return new AnnotatingEntitySerializer(this); 

     return base.GetEdmTypeSerializer(edmType); 
    } 
} 


public class AnnotatingEntitySerializer : ODataResourceSerializer 
{ 
    public AnnotatingEntitySerializer(ODataSerializerProvider serializerProvider) 
     : base(serializerProvider) 
    { 
    } 

    public override Microsoft.OData.ODataProperty CreateStructuralProperty(IEdmStructuralProperty structuralProperty, ResourceContext resourceContext) 
    { 
     Microsoft.OData.ODataProperty property = base.CreateStructuralProperty(structuralProperty, resourceContext); 

     if (resourceContext.StructuredType.FullTypeName() == typeof(Site).FullName) 
     { 
      if (property.Name == "IsDeleted") // NOTE: here, rather than checking for the property name, I want to check if it has an attribute of "ExcludeMe" 
      { 
       return null; 
      } 
     } 

     return property; 
    } 

    public override void AppendDynamicProperties(ODataResource resource, System.Web.OData.Formatter.Serialization.SelectExpandNode selectExpandNode, 
     ResourceContext resourceContext) 
    { 
     base.AppendDynamicProperties(resource, selectExpandNode, resourceContext); 
    } 
} 

もちろん、ハードコードされたプロパティ名ではなく、シリアル化されているかどうかを選択する属性を使用したいと思います。可能?ありがとう。それはhttps://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTestに見える

答えて

0

Rockyourteeth

は、あなたが探しているものです。

私のサンプルは5.xバージョンでは複雑なタイプですが、6.xバージョンではエンティティ(リソース)に使用できます。

あなたのシナリオではうまくいかない場合は教えてください。

関連する問題