@lucky4

Как перенести метод в middleware?

Есть метод основной метод:
private async Task<TResult> ExecuteImplementation<TResult>(Func<string, Task<TResult>> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
        {
            TResult result;
            var stopwatch = new Stopwatch();

            var correlationId = Guid.NewGuid().ToString();
            var correlationIdProperty = this.logger.PushCorrelationIdProperty(correlationId);

            this.GetControllerActionNames(out var controllerName, out var actionName);

            if (additionalLoggingData != null)
            {
                var loggingDataWithLocalData =
                    new[]
                        {
                            new KeyValuePair<string, object>(ControllerNamePropertyName, controllerName),
                            new KeyValuePair<string, object>(ActionNamePropertyName, actionName)
                        }
                        .Union(additionalLoggingData)
                        .ToArray();
                this.logger.LogInfo(string.Format(StartsExecutingMessageForStringFormat, controllerName, actionName, correlationId), loggingDataWithLocalData);
            }
            else
            {
                this.logger.LogInfo(StartsExecutingMessageForParams, controllerName, actionName);
            }

            try
            {
                stopwatch.Start();
                result = await awaitableFunction(correlationId);
            }
            catch (Exception exception)
            {
                this.logger.LogError(exception);
                throw;
            }
            finally
            {
                stopwatch.Stop();

                this.logger.LogInfo(ExecutedMillisecondsMessage, controllerName, actionName, stopwatch.ElapsedMilliseconds);

                correlationIdProperty.Dispose();
            }

            return result;
        }


Этот метод используется двумя методами, который потом прокидываются как обертка для контроллеров:
public async Task<TResult> ExecuteControllerAction<TResult>(Func<string, Task<TResult>> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
        {
            var result = await this.ExecuteImplementation(awaitableFunction, additionalLoggingData);
            return result;
        }

        public async Task ExecuteControllerAction(Func<string, Task> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
        {
            await this.ExecuteImplementation(
                async (correlationId) =>
                    {
                        await awaitableFunction(correlationId);
                        return (object)null;
                    });
        }


Метод, который вызывается в контрллере:
public async Task ControllerAction(SomeDtoExample dtoRequest)
        {
            await this.Logger.ExecuteControllerAction(async correlationId =>
            {....


Была мысля как-то перенести ExecuteImplementation() как middleware. Уже практически сделал(прокинув в метод парметр HttpContext, делегат и тд и тп), но понял что "картинка не складывается". Так как, в контроллерах бывает используются доп методы, которые и вызывают самый главный ExecuteImplementation метод.

Возможно, есть какой-то способ это прокинуть в одну часть, что бы каждый раз метод(экшн) контроллера не обертывать?
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы