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();
}
我希望 OutputA
和 OutputB
这两种类型都将列为 return 类型,
但是只提到了IOutput
:
或者,如果我将 IOutput
从 interface
更改为 class
或 abstract class
,则 OutputA
和 OutputB
将被列为有效 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>();
});
});
在下面的代码中,我试图提及替代模式;与响应类型共享相同的接口[=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();
}
我希望 OutputA
和 OutputB
这两种类型都将列为 return 类型,
但是只提到了IOutput
:
或者,如果我将 IOutput
从 interface
更改为 class
或 abstract class
,则 OutputA
和 OutputB
将被列为有效 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>();
});
});