如何为多态配置正确的 swashbuckle

How to configure swashbuckle correct for polymorphism

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

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

Link 到示例项目 Sample project

这是我的多态模型

namespace SwashbuckleTest.Models
{
    public interface ITypeDiscriminator
    {
        string TypeDiscriminator { get; }
    }

    public abstract class SurveyStep : ITypeDiscriminator
    {
        public virtual string Id { get; set; }
        public string TypeDiscriminator => GetType().Name;
    }

    public abstract class SurveyStepResult : ITypeDiscriminator
    {
        public string Id { get; set; }

        public string TypeDiscriminator => GetType().Name;
    }

    public class BoolStep : SurveyStep
    {
        private string _id;

        public BoolStep()
        {
            ResultObject = new BoolStepResult();
        }

        public override string Id
        {
            get => _id;
            set
            {
                _id = value;
                ResultObject.Id = value;
            }
        }

        public string Question { get; set; }

        public BoolStepResult ResultObject { get; }
    }

    public class BoolStepResult : SurveyStepResult
    {
        public bool Value { get; set; }
    }
}

这里是其他型号

namespace SwashbuckleTest.Models
{
    public abstract class SomeBaseModel
    {
        public string BaseValue { get; set; }
    }

    public class SomeConcreteModel : SomeBaseModel
    {
        public int ConcreteValue { get; set; }
    }
}

和我试过的配置

options.UseAllOfToExtendReferenceSchemas();
options.GeneratePolymorphicSchemas(t =>
{
    var types = t.Is<SurveyStep>() ? new List<Type>() {typeof(BoolStep)}
        : t.Is<SurveyStepResult>() ? new List<Type>() {typeof(BoolStepResult)}
        : null;
    return types;
} , t => t.Is<ITypeDiscriminator>() ? nameof(ITypeDiscriminator.TypeDiscriminator).ToCamelCase() : null);

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

我自己发现了问题。

Is<> 扩展方法不过滤抽象 类 所以我们得到了无尽的递归。

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