Ste*_*eve 5 c# swagger asp.net-core
目前,我有 20 个端点,它们的代码与这 3 行ProducesResponseType
. 我正在使用 .NET Core 3.1 和 Swagger。如何重构我的代码以使其 DRY(不要重复自己)?
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(SuccessResponse))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ErrorResponse))]
[ProducesResponseType(StatusCodes.Status500InternalServerError, Type = typeof(ErrorResponse))]
public IActionResult Controller1(){
// code removed for brevity
}
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(SuccessResponse))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ErrorResponse))]
[ProducesResponseType(StatusCodes.Status500InternalServerError, Type = typeof(ErrorResponse))]
public IActionResult Controller2(){
// code removed for brevity
}
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(SuccessResponse))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ErrorResponse))]
[ProducesResponseType(StatusCodes.Status500InternalServerError, Type = typeof(ErrorResponse))]
public IActionResult Controller3(){
// code removed for brevity
}
Run Code Online (Sandbox Code Playgroud)
ASP.NET Core 支持Web API 约定,其中:
...包括一种提取通用 API 文档并将其应用于程序集中的多个操作、控制器或所有控制器的方法。
第一步是创建一个static class
, 并使用定义约定的方法:
public static class SomeApiConvention
{
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(SuccessResponse))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ErrorResponse))]
[ProducesResponseType(StatusCodes.Status500InternalServerError, Type = typeof(ErrorResponse))]
[ApiConventionNameMatch(ApiConventionNameMatchBehavior.Any)]
public static void Default() { }
}
Run Code Online (Sandbox Code Playgroud)
类的名称并不重要,但方法的名称会影响约定的应用方式。在上面的示例中,该[ApiConventionNameMatch]
属性禁用此特定功能,以便无论操作的方法名称如何都使用约定。
要将此约定应用于控制器,请使用以下[ApiConventionType]
属性:
[ApiConventionType(typeof(SomeApiConvention))]
public class Controller1 : ControllerBase
Run Code Online (Sandbox Code Playgroud)
由于配置[ApiConventionNameMatch]
已经突出显示,因此这种方法将约定应用于控制器定义的每个操作。或者,如果您更改Default
为其他内容(例如 )Get
并删除该[ApiConventionType]
属性,则该约定将仅适用于名为 的操作Get
。
要将约定仅应用于特定操作,请使用以下[ApiConventionMethod]
属性:
[ApiConventionMethod(typeof(SomeApiConvention), nameof(SomeApiConvention.Default))]
public IActionResult Action1()
Run Code Online (Sandbox Code Playgroud)
此方法需要Type
约定类的名称和要应用的方法的名称。
这个功能还有很多内容,我已经提到的文档中对此进行了描述。我不会在这里重复所有内容,因为我希望上面包含的信息足以让您到达您想要的地方。