Net Core API: сделать глобальный параметр ProducesResponseType или автоматизировать - PullRequest
2 голосов
/ 22 сентября 2019

У нас более 100 API, и мы должны написать ProducesResponseType для всех наших APIS сверху, 200, 500 и т. Д. Есть ли способ сделать этот глобальный параметр для всех наших функций get, поэтому нам не нужно продолжатьповторяющийся код?Попытка заставить API следовать принципу Dry и быть тонкими контроллерами.

[HttpGet("[Action]/{id}")]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<GetBookResponse>> GetByBook(int id)
{
   var book = await bookservice.GetBookById(id);
   return Ok(book);
}

Ресурсы:

Установить один тип ProducesResponseType для нескольких HttpStatusCodes

Net Core API: назначение ProduresResponseType

1 Ответ

2 голосов
/ 22 сентября 2019

Вы можете создать пользовательский IApplicationModelProvider и добавить нужные фильтры в методе OnProvidersExecuting.

ProduceResponseTypeModelProvider.cs

public class ProduceResponseTypeModelProvider : IApplicationModelProvider
{
    public int Order => 3;

    public void OnProvidersExecuted(ApplicationModelProviderContext context)
    {
    }

    public void OnProvidersExecuting(ApplicationModelProviderContext context)
    {
        foreach (ControllerModel controller in context.Result.Controllers)
        {
            foreach (ActionModel action in controller.Actions)
            {
                // I assume that all you actions type are Task<ActionResult<ReturnType>>

                Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];

                action.Filters.Add(new ProducesResponseTypeAttribute(StatusCodes.Status510NotExtended));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status200OK));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status500InternalServerError));
            }
        }
    }
}

Тогда вам нужнозарегистрировать его на IServiceCollection

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...   
    services.TryAddEnumerable(ServiceDescriptor.Transient<IApplicationModelProvider, ProduceResponseTypeModelProvider>());
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...