я могу использовать IAsyncActionFilter / OnActionExecutionAsyn c для обработки результата действия - PullRequest
0 голосов
/ 30 апреля 2020

В большинстве моих контроллеров (API) (. net core 3.1) я вызываю функцию и использую ответ этой функции, чтобы затем создать соответствующий результат действия. Это выглядит примерно так:

[HttpPost("{id}/read")]
    public async Task<IActionResult> ReadMessage(Guid id)
    {
        ResponseApiModel r = await _messageData.ReadOneMessage(id);

        if (r.ApiResponse != ApiResponse.AllGood)
        {
            if (r.ApiResponse == ApiResponse.NotFound)
                return NotFound(r);
            else
                return BadRequest(r);
        }
    }

Дело в том, что оператор if в основном повторяется в нескольких действиях на всех моих контроллерах. Я хотел бы иметь возможность переместить этот код в фильтр действий. Но не могу понять, как это сделать. В конце концов, как мне передать ResponeApiModel в фильтр.

Я уже переместил весь другой общий код в фильтр, поэтому все проверки подлинности, а также исключения обрабатываются в фильтрах. Но я не могу понять, как это сделать.

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете использовать внедрение зависимостей.

Решение зависит от того, используете ли вы ServiceFilter или TypeFilter:

При использовании ServiceFilter:

1) Зарегистрировать данные сообщения как службу

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<MessageDataService>();
    ...
}

2) Разрешить зависимость в конструкторе вашего атрибута

public class TheFilter : IActionFilter
{
    private readonly MessageDataService _messageData;

    public ThrottleFilter(MessageDataService messageData)
    {
        _messageData = messageData;
    }
    ...
}

3) Использовать атрибут ServiceFilter

[ServiceFilter(typeof(TheFilter))]

При использовании TypeFilter точка 1 не требуется.

Источники:

Внедрение зависимостей в фильтрах действий в ASP. NET Core

ServiceFilter и TypeFilter - какая разница в инжекции этих фильтров?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...