Исключить виртуальные свойства ef из чванства - PullRequest
1 голос
/ 04 июля 2019

Я добавил Swashbuckle в проект web-api core .net, используя ef-core. Моя проблема заключается в том, что виртуальные свойства моих автоматически сгенерированных классов ef добавляются в примеры ответов swagger, что делает ответы огромными, я просто хочу отобразить свойства таблицы, а не отношения.

Пример кода с контроллера:

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

Моя проблема в том, что автоматически сгенерированные классы находятся в отдельной библиотеке классов, к которой у меня нет доступа к изменениям. Я не могу просто добавить JsonIgnore к этим виртуальным свойствам.

Можно ли заставить Swashbuckle игнорировать все виртуальные свойства?

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Вы можете реализовать свой собственный 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);
    
1 голос
/ 04 июля 2019

Вы можете использовать модель вида вместо исходной модели и поместить поля для отображения в модель вида. Вместо исходной модели отправьте модель представления клиенту

0 голосов
/ 05 июля 2019

На ум приходят две возможности: Сначала используйте autopper для сопоставления с вашим POCO. Проблема в том, что вам нужно pocos, но, с другой стороны, вы получаете много контроля, который вам все равно понадобится позже.

Или вы можете использовать ODATA напрямую, что, по сути, решит вашу проблему и даст вам возможность запрашивать возможности бесплатно.

...