2017-10-17 12 views
0

OData로 serialize되는 모델에 특성을 넣을 수 있으며이를 기반으로 직렬화하도록 선택할 수 있습니까?Odata 4 - ODataResourceSerializer의 사용자 지정 특성을 기반으로 속성을 serialize하는 방법

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 버전의 엔터티 (리소스)에 사용할 수 있습니다.

귀하의 시나리오에서 작동하지 않는지 알려주십시오.