如何将模式过滤器添加到一个Swashbuckle api文档版本中

问题描述 投票:1回答:1

我有一个问题,我使用Swashbuckle 4,但它不支持多态,我发现有两个过滤器可以做到这一点。一个DocumentFilter和一个SchemaFilter。

它们像魔咒一样工作。

但是现在我遇到了问题,我在api中添加了第二个版本。但是我有一个多态模型,版本2仅支持该模型。

但是我找不到将这些过滤器仅添加到一个api版本的方法,因为它们是在启动时添加到SwaggerGenOptions的。

我有点为Swashbuckle似乎不支持每个版本的过滤器而感到震惊,因为版本完全可以在一个项目中分隔两个代码世界。

有什么想法吗?

c# asp.net-core swashbuckle
1个回答
0
投票

我们需要一个示例的原因是因为有不同的版本控制方法。我不确定您的操作方式,但通常是用一个具有相同名称的新类对Model进行版本控制,但使用不同的Namespace,在这种情况下就没有问题。注册所有过滤器。他们应该知道如何判断正在处理的对象是否是他们知道如何处理的对象。我不熟悉IDocumentFilter,但是对于ISchemaFilter:

    public class MyV1SchemaFilter : ISchemaFilter
    {
        public void Apply(Schema schema, SchemaFilterContext context)
        {
            if (context.SystemType != MyProject.Models.v1.MyModel) return;
            /// configure v1 schema
        }
    }

    public class MyV2SchemaFilter : ISchemaFilter
    {
        public void Apply(Schema schema, SchemaFilterContext context)
        {
            if (context.SystemType != MyProject.Models.v2.MyModel) return;
            /// configure v2 schema
        }
    }

您也可以将其全部放入一个过滤器中:

    public class MySchemaFilter : ISchemaFilter
    {
        public void Apply(Schema schema, SchemaFilterContext context)
        {
            if (context.SystemType == MyProject.Models.v1.MyModel)
            {
                /// configure v1 schema
            }
            else if (context.SystemType == MyProject.Models.v2.MyModel)
            {
                /// configure v2 schema
            }
        }
    }

如果您以某种方式用相同的Class表示两个版本,则可能需要将它们分开。

DocumentFilterContext似乎那里有足够的数据,它也可以知道它传递的版本。


推荐问答