在下面的代码中,我试图提到替代模式;它们与响应类型共享相同的接口。
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
2条答案
按热度按时间34gzjxbg1#
我遇到了swagger gen没有包含实现接口的类型的模式的问题(适用于抽象基类/记录)。我使用下面的解决方案,因为它比指定单个类型更通用。
zysjyyx42#
分享我找到的解决方案,以防万一有人可能需要它。
我们的想法是通过
SelectSubTypesUsing()
显式地通过AddSwaggerGen()
添加多态关系: