Swagger Swashbuckle 多态性不适用于接口类型

Swagger Swashbuckle Polymorphism doesn't work with interface types

在下面的代码中,我试图提及替代模式;与响应类型共享相同的接口[=52​​=]。

Startup.cs

services.AddSwaggerGen(c =>
{
    c.UseOneOfForPolymorphism();
});

app.UseSwagger();
app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
});

型号

public interface IOutput
{
    string Discriminator { get; }
}

public class OutputA : IOutput
{
    public string Discriminator => GetType().Name;

    public string PropA { get; set; }
}

public class OutputB : IOutput
{
    public string Discriminator => GetType().Name;

    public string PropB { get; set; }
}

控制器

[HttpGet]
[ProducesResponseType(typeof(IOutput), StatusCodes.Status200OK)]
public IActionResult Get()
{
    return Ok();
}

我希望 OutputAOutputB 这两种类型都将列为 return 类型, 但是只提到了IOutput

或者,如果我将 IOutputinterface 更改为 classabstract class,则 OutputAOutputB 将被列为有效 return 类型:

是否由于 RESTFul/API 标准而不受支持?

或者这可以实现吗?

这是一个.NET Core 2.2项目,使用Swashbuckle.AspNetCore v6.2.3

分享我找到的解决方案,以备不时之需。

想法是通过 AddSwaggerGen() 通过 SelectSubTypesUsing() 显式添加多态关系,如:

services.AddSwaggerGen(c =>
{
    c.UseOneOfForPolymorphism();
    c.SelectSubTypesUsing(baseType =>
    {
        if (baseType == typeof(IOutput))
        {
            return new[]
            {
                typeof(OutputA),
                typeof(OutputB)
            };
        }
        return Enumerable.Empty<Type>();
    });
});