簡體   English   中英

如何為多態性正確配置 swashbuckle

[英]How to configure swashbuckle correct for polymorphism

從 5.0.0 更新到 5.4.1 后,我無法獲得正確的 OpenApi 定義

我們有 5.0.0 版本的自定義多態過濾器,但它們不適用於最新版本。 所以我刪除了它們並開始使用 GeneratePolymorphicSchemas()。 它可以滿足我對多態模型的需求,而不僅僅是為它們。 我們還有一些其他的抽象類和具體類,我們不需要類型鑒別器。 我嘗試了不同的配置,但沒有任何成功。 生成的定義是錯誤的,或者我在 swagger UI 上收到錯誤或服務器 503 錯誤。

鏈接到示例項目示例項目

這是我的polimorhic模型

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,但我們遇到了其他問題,這些問題有點深。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM