【问题标题】:Exclude ef virtual properties from swagger response从招摇响应中排除 ef 虚拟属性
【发布时间】:2019-07-05 17:52:38
【问题描述】:

我使用 ef-core 将 Swashbuckle 添加到 .net core web-api 项目中。 我的问题是我的 ef 自动生成的类的虚拟属性被添加到了招摇示例响应中,这使得响应变得巨大,我只想显示表格属性,而不是关系。

来自控制器的代码示例:

[HttpGet("devices", Name = "GetDevices")]
public async Task<ActionResult<List<Device>>> Devices()
{
    var devices = await _deviceDa.GetDevices();
    return Json(devices);
}

我的问题是 ef 自动生成的类位于一个单独的类库中,我无权更改。我不能简单地将 JsonIgnore 添加到这些虚拟属性中。

是否可以让 Swashbuckle 忽略所有虚拟属性?

【问题讨论】:

  • 如果使用 ViewModel 会怎样?看起来您正在返回对象本身,这不是一个好习惯,您应该始终返回 DTO(数据传输对象)。然后在 DTO 上,您可以设置要返回的属性。
  • 这在微服务架构上运行,这个特定的服务只是 SQL 数据库的一个休息接口,然后还有一个额外的微服务可以为用户表提供各种 DTO 端点。

标签: c# swagger asp.net-core-webapi swashbuckle


【解决方案1】:

您可以实现自己的ContractResolver 以在序列化模型时忽略虚拟属性。

  1. IgnoreVirtualContractResolver

    public class IgnoreVirtualContractResolver: DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty prop = base.CreateProperty(member, memberSerialization);
            var propInfo = member as PropertyInfo;
            if (propInfo != null)
            {
                if (propInfo.GetMethod.IsVirtual && !propInfo.GetMethod.IsFinal)
                {
                    prop.ShouldSerialize = obj => false;
                }
            }
            return prop;
        }
    }
    
  2. 注册

    services.AddMvc()
            .AddJsonOptions(options => {
                options.SerializerSettings.ContractResolver = new IgnoreVirtualContractResolver();
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    

【讨论】:

    【解决方案2】:

    我想到了两种可能性: 首先使用 automapper 映射到您的 POCO。问题是你需要 pocos,但另一方面你获得了很多你以后需要的控制权。

    或者您可以直接使用 ODATA,这基本上解决了您的问题,并为您提供免费的查询功能。

    【讨论】:

      【解决方案3】:

      您可以使用视图模型代替原始模型,并将字段显示在视图模型中。 代替原始模型,将视图模型发送给客户端

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2017-01-27
        • 2015-03-03
        • 2019-06-05
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        相关资源
        最近更新 更多