重构许多重复的 ProducesResponseType 以使其干燥

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)

Kir*_*kin 2

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约定类的名称和要应用的方法的名称。


这个功能还有很多内容,我已经提到的文档中对此进行了描述。我不会在这里重复所有内容,因为我希望上面包含的信息足以让您到达您想要的地方。