asp.net-core - Swagger Swashbuckle 多态性不适用于接口(interface)类型

标签 asp.net-core asp.net-web-api swagger openapi swashbuckle

通过下面的代码,我试图提及替代模式;与响应的类型共享相同的接口(interface)

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; }
}

Controller

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

我希望 OutputAOutputB 两种类型都将被列为返回类型, 但是只提到了IOutput:

enter image description here

或者,如果我将 IOutputinterface 更改为 classabstract class 然后 OutputAOutputB 将被列为有效的返回类型:

enter image description here

是否由于 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>();
    });
});

关于asp.net-core - Swagger Swashbuckle 多态性不适用于接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70555022/

相关文章:

c# - .NET Core 中的 MemoryStream 服务

javascript - 最终用户可见的 Power BI 配置

asp.net-web-api - 在 Xamarin 上存储访问 token 和刷新 token

java - 需要为 SseEmitter 其余部分编写 Swagger yaml (MVC server-sent-events )

python - Swagger API 以及与 python 请求的交互

c# - ViewBag 没有向 View 发送任何值

c# - 如何从 AppSettings 读取配置值并将配置注入(inject)接口(interface)实例

javascript - 使用来自 AngularJS 的 Web API JSON 响应 - 错误 : expected and array but got an object

c# - 如何销毁包含三个列表的 List 元素,以便我可以创建一个列表以添加到数据库

java - 如何 Swagger 下拉可能的值