如何为多态配置正确的 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,但我们遇到了其他问题,这些问题更深一些。
从 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,但我们遇到了其他问题,这些问题更深一些。