Odata 4 - 如何根据ODataResourceSerializer中的自定义属性序列化属性

时间:2017-10-17 21:06:56

标签: api serialization attributes entity-framework-6 odata

我可以在使用OData序列化的模型上放置属性,并选择基于它进行序列化吗?

我已成功扩展ODataResourceSerializer,并重写了CreateStructuralProperty。这使我能够检查属性的名称,并选择是否序列化它。

以下是我设置的内容(正在运行)的摘要。这是我在Startup中注册服务的地方......

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

但是,当然,我想使用一个属性来选择是否序列化,而不是硬编码的属性名称。可能?感谢。

1 个答案:

答案 0 :(得分:0)

Rockyourteeth

看起来https://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTest正是您要找的。

我的示例是针对5.x版本下的复杂类型,但它可以用于6.x版本下的实体(资源)。

请告诉我它是否适用于您的方案。