【问题标题】:Odata 4 - How to serialize a property based on custom attribute in ODataResourceSerializerOdata 4 - 如何根据 ODataResourceSerializer 中的自定义属性序列化属性
【发布时间】:2017-10-17 21:06:55
【问题描述】:

我可以在使用 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);
    }
}

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

【问题讨论】:

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


    【解决方案1】:

    摇滚你的牙齿

    看起来https://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTest 就是你要找的东西。

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

    如果它不适用于您的场景,请告诉我。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2017-05-20
      • 1970-01-01
      • 2017-03-05
      • 2010-12-25
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多