首页 > 解决方案 > 如何为多态性正确配置 swashbuckle

问题描述

从 5.0.0 更新到 5.4.1 后,我无法获得正确的 OpenApi 定义

我们有 5.0.0 版本的自定义多态过滤器,但它们不适用于最新版本。所以我删除了它们并开始使用 GeneratePolymorphicSchemas()。它可以满足我对多态模型的需求,而不仅仅是为它们。我们还有一些其他的抽象类和具体类,我们不需要类型鉴别器。我尝试了不同的配置,但没有任何成功。生成的定义是错误的,或者我在 swagger UI 上收到错误或服务器 503 错误。

链接到示例项目示例项目

这是我的polimorhic模型

命名空间 SwashbuckleTest.Models
{
    公共接口 ITypeDiscriminator
    {
        字符串类型鉴别器 { 得到;}
    }

    公共抽象类 SurveyStep : ITypeDiscriminator
    {
        公共虚拟字符串 ID { 获取;放; }
        公共字符串 TypeDiscriminator => GetType().Name;
    }

    公共抽象类 SurveyStepResult : ITypeDiscriminator
    {
        公共字符串 ID { 获取;放; }

        公共字符串 TypeDiscriminator => GetType().Name;
    }

    公共类 BoolStep : SurveyStep
    {
        私有字符串_id;

        公共布尔步骤()
        {
            ResultObject = new BoolStepResult();
        }

        公共覆盖字符串 ID
        {
            得到 => _id;
            放
            {
                _id = 值;
                ResultObject.Id = 值;
            }
        }

        公共字符串问题{获取;放; }

        公共 BoolStepResult 结果对象 { 获取;}
    }

    公共类 BoolStepResult : SurveyStepResult
    {
        公共布尔值 { 得到;放; }
    }
}

这里其他型号

命名空间 SwashbuckleTest.Models
{
    公共抽象类 SomeBaseModel
    {
        公共字符串 BaseValue { 获取;放; }
    }

    公共类 SomeConcreteModel : SomeBaseModel
    {
        公共 int ConcreteValue { 获取;放; }
    }
}

和我尝试过的配置

options.UseAllOfToExtendReferenceSchemas();
options.GeneratePolymorphicSchemas(t =>
{
    var types = t.Is<SurveyStep>() ?新列表<类型>() {typeof(BoolStep)}
        : t.Is<SurveyStepResult>() 吗?新列表<类型>() {typeof(BoolStepResult)}
        : 无效的;
    返回类型;
} , t => t.Is<ITypeDiscriminator>() 吗?nameof(ITypeDiscriminator.TypeDiscriminator).ToCamelCase() : null);

// 或者
options.GeneratePolymorphicSchemas(discriminatorSelector: t => t.Is<ITypeDiscriminator>() ? nameof(ITypeDiscriminator.TypeDiscriminator).ToCamelCase() : null);

标签: c#polymorphismopenapiswashbuckle

解决方案


我自己发现了问题。

扩展方法不过滤抽象类,Is<>所以我们在这里无限递归。

它帮助我们生成了 swagger.json,但我们遇到了其他问题,这些问题更深一些。


推荐阅读