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

问题描述 投票:0回答:2

通过下面的代码,我试图提及替代模式;它们共享相同的接口,作为响应的类型。

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

我期望

OutputA
OutputB
这两种类型都将被列为返回类型, 但只提到了
IOutput

或者,如果我将

IOutput
interface
更改为
class
abstract class
,则
OutputA
OutputB
将被列为有效返回类型:

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

或者这个可以实现吗?

这是一个

.NET Core 2.2
项目,使用
Swashbuckle.AspNetCore v6.2.3

asp.net-core asp.net-web-api swagger openapi swashbuckle
2个回答
9
投票

分享我找到的解决方案,以防万一有人需要它。

这个想法是通过

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

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

0
投票

我遇到了 swagger gen 不包括实现接口的类型的模式的问题(适用于抽象基类/记录)。我使用了以下解决方案,因为它比指定单个类型更通用。

builder.Services.AddSwaggerGen(opts => {    
    opts.UseOneOfForPolymorphism();
    //Needed to generate schema from derived types of an interface (base class/record already supported) 
    opts.SelectSubTypesUsing(baseT => {
        return Assembly.GetAssembly(typeof(<SomeTypeInTheLibYouwant>))?.GetTypes()
                        .Where(derivedT => baseT.IsAssignableFrom(derivedT));
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.