Asp.net core 使用Asp.net core的Swashback如何将模型添加到生成的模型列表中?

Asp.net core 使用Asp.net core的Swashback如何将模型添加到生成的模型列表中?,asp.net-core,swagger-2.0,swashbuckle,Asp.net Core,Swagger 2.0,Swashbuckle,我正在使用ASP.net内核。它正在制作一个很好的网站,底部有一个模型列表 如何将尚未出现的模型添加到此列表中 我在一个请求中返回一个抽象类,我想列出继承该抽象类的所有变体 提前感谢可能不是最干净的解决方案,但我通过在控制器上方设置一个productsResponseType属性实现了同样的效果: [ProducesResponseType(typeof(object), 200)] public class FileController : Controller { 将对象替换为要在模型中

我正在使用ASP.net内核。它正在制作一个很好的网站,底部有一个模型列表

如何将尚未出现的模型添加到此列表中

我在一个请求中返回一个抽象类,我想列出继承该抽象类的所有变体


提前感谢

可能不是最干净的解决方案,但我通过在控制器上方设置一个
productsResponseType
属性实现了同样的效果:

[ProducesResponseType(typeof(object), 200)]
public class FileController : Controller
{

将对象替换为要在模型中显示的对象,并为每个其他对象创建新行。只需确保对每个文件使用不同的状态代码,否则它将只显示最后一个。

您可以创建一个文档过滤器并全局注册它

公共类CustomModelDocumentFilter:IDocumentFilter其中T:class
{
公共无效应用(SwaggerDocument swaggerDoc、DocumentFilterContext上下文)
{
GetOrRegister(typeof(T));
}
}
然后在
启动
类中注册它

services.AddSwaggerGen(选项=>
{
...
options.DocumentFilter();
options.DocumentFilter();
...
}
对于多态类,您可以使用这些来筛选(稍微改进的版本)

公共类多态性DocumentFilter:IDocumentFilter
{
公共无效应用(SwaggerDocument swaggerDoc、DocumentFilterContext上下文)
{
注册表子类(context.SchemaRegistry,typeof(T));
}
私有静态无效注册表子类(ISchemaRegistry schemaRegistry,类型abstractType)
{
常量字符串鉴别器名称=“$type”;
string friendlyId=abstractType.friendlyId();
if(!schemaRegistry.Definitions.TryGetValue(friendlyId,out Schema parentSchema))
parentSchema=schemaRegistry.GetOrRegister(abstractType);
//设置鉴别器属性(必须是必需的)
parentSchema.Discriminator=discriminatorName;
parentSchema.Required=新列表{discriminatorName};
if(parentSchema.Properties==null)
parentSchema.Properties=新字典();
如果(!parentSchema.Properties.ContainsKey(鉴别器名称))
parentSchema.Properties.Add(discriminatorName,新模式{Type=“string”,默认值=abstractType.FullName});
//注册所有子类
var derivedTypes=abstractType.GetTypeInfo().Assembly.GetTypes()
其中(x=>abstractType!=x&&abstractType.IsAssignableFrom(x));
foreach(派生类型中的var项)
schemaRegistry.GetOrRegister(项目);
}
}
公共类多态SchemaFilter:ISchemaFilter
{
private readonly Lazy-derivedTypes=new Lazy(Init);
public void Apply(架构、SchemaFilterContext上下文)
{
if(!derivedTypes.Value.Contains(context.SystemType))返回;
var type=context.SystemType;
var clonedSchema=新模式
{
Properties=schema.Properties,
Type=schema.Type,
Required=schema.Required
};
//schemaRegistry.Definitions[typeof(T).Name];在Swashback.AspNetCore中无法正常工作
var parentSchema=newschema{Ref=“#/definitions/”+typeof(T).Name};
var assemblyName=Assembly.GetAssembly(类型).GetName();
schema.Discriminator=“$type”;
//如果使用Microsoft的AutoRest客户端生成JavaScript/TypeScript模型,则需要执行此操作
schema.Extensions.Add(“x-ms-discriminator-value”,$”{type.FullName},{assemblyName.Name}”);
schema.AllOf=新列表{parentSchema,clonedSchema};
//allOf中包含的重置属性应为null,但代码不处理它
schema.Properties=newdictionary();
}
私有静态HashSet Init()
{
var abstractType=typeof(T);
var dTypes=abstractType.GetTypeInfo().Assembly
.GetTypes()
其中(x=>abstractType!=x&&abstractType.IsAssignableFrom(x));
var result=new HashSet();
foreach(数据类型中的变量项)
结果.添加(项目);
返回结果;
}
}
需要两个筛选器。第一个筛选器将把所有交付的类添加到架构中。它还将基类中不存在的属性添加到派生类型的架构中

第二个过滤器添加一些属性(
$type
,用于模型返回时的序列化)和扩展(用于Microsoft的AutoRest客户端/生成器),并将
allOf
属性添加到Swagger架构中,这是在使用Swagger gen或AutoRest生成时创建继承架构所必需的

注册类似,只是需要成对注册(只需要注册基类)

//以下几行将多态性添加到swagger.json模式中,以便
//代码生成器可以正确创建继承层次结构。
options.DocumentFilter();
options.SchemaFilter();
ASP.NET Core 3和Swashback.AspNetCore 5.0的更新
公共类CustomModelDocumentFilter:IDocumentFilter其中T:class
{
公共作废应用(OpenApiDocument openapiDoc、DocumentFilterContext上下文)
{
context.SchemaGenerator.GenerateSchema(typeof(T),context.SchemaRepository);
}
}
PolymorphismDocumentFilter
/
PolymorphismSchemaFilter
更新为
Swashback.AspNetCore
5.0

公共类多态性DocumentFilter:IDocumentFilter
{
公共作废应用(OpenApiDocument openApiDoc、DocumentFilterContext上下文)
{
寄存器子类(上下文,类型(T));
}
私有静态void注册表子类(DocumentFilterContext上下文,类型abstractType)
{
常量字符串鉴别器名称=“$typ”
public class GenericAPI_DocumentFilter<T> : IDocumentFilter where T : class
{

    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {

        foreach (var t in Assembly.GetExecutingAssembly().GetTypes())
        {
            if (t.Namespace.Contains("MyAPI") && t.IsClass)
            {

                var a = t.GetCustomAttribute(typeof(DataContractAttribute));
                if (a != null)
                {
                    context.SchemaRegistry.GetOrRegister(t);
                }

            }
        }

    }
}
services.AddSwaggerGen(opt =>
            {
...
opt.DocumentFilter<GenericAPI_DocumentFilter<object>>();
...
}
[HttpGet("")]
[ProducesResponseType(typeof(MyResult), (int)System.Net.HttpStatusCode.OK)]
[ProducesResponseType(typeof(ErrorBase), (int)System.Net.HttpStatusCode.NotFound)]
... function definition ...
return Ok(myresult)
return NotFound(myerror)