public async Task Execute(HttpRequestExcutorContext context)
            {
                if (_onBefore != null)
                {
                    try
                    {
                        context.Result = await _onBefore(context.Request);
                    }
                    catch (Exception error)
                    {
                        context.Error = error;

                        await Error.Execute(context);

                        return;
                    }
                }

                if (context.Result == null)
                {
                    await Handler.Execute(context);
                }
                else
                {
                    await After.Execute(context);
                }
            }
            public async Task Execute(HttpRequestExcutorContext context)
            {
                if (_onAfter != null)
                {
                    try
                    {
                        context.Result = await _onAfter(context.Request, context.Result);
                    }
                    catch (Exception error)
                    {
                        context.Error = error;

                        await Error.Execute(context);
                    }
                }
            }
            public async Task Execute(HttpRequestExcutorContext context)
            {
                var error = context.Error;

                if (error != null)
                {
                    if (_onError != null)
                    {
                        context.Result = await _onError(context.Request, context.Error);
                    }
                    else
                    {
                        // Вне зависимости от наличия прикладных обработчиков, фиксируем событие ошибки
                        _log.Error(Resources.RequestProcessingCompletedWithUnexpectedException, null, error);

                        throw new InvalidOperationException(Resources.RequestProcessingCompletedWithUnexpectedException, error);
                    }
                }
            }
        /// <summary>
        /// Создает функцию обработки запросов.
        /// </summary>
        /// <param name="onBefore">Предобработчик запросов.</param>
        /// <param name="onHandle">Основной обработчик запросов.</param>
        /// <param name="onAfter">Постобработчик запросов.</param>
        /// <param name="onError">Обработчик исключений.</param>
        /// <param name="resultConverter">Конвертер результата.</param>
        /// <returns>Функция обработки запросов.</returns>
        /// <remarks>
        /// Функция обработки запросов выполнена по принципу Chain of Responsibility.
        /// На каждом шаге обработки запроса принимается решение, какой шаг будет вызван далее.
        /// </remarks>
        public Func <IHttpRequest, Task <object> > CreateExecutor(Func <IHttpRequest, Task <object> > onBefore,
                                                                  Func <IHttpRequest, Task <object> > onHandle,
                                                                  Func <IHttpRequest, object, Task <object> > onAfter,
                                                                  Func <IHttpRequest, Exception, Task <object> > onError,
                                                                  Func <object, IHttpResponse> resultConverter)
        {
            // Создание цепочки обработки запроса

            var beforeExcutor  = new BeforeHttpRequestExcutor(onBefore);
            var handlerExcutor = new HandlerHttpRequestExcutor(onHandle);
            var afterExcutor   = new AfterHttpRequestExcutor(onAfter);
            var errorExcutor   = new ErrorHttpRequestExcutor(onError, _log);

            beforeExcutor.Handler = handlerExcutor;
            beforeExcutor.After   = afterExcutor;
            beforeExcutor.Error   = errorExcutor;

            handlerExcutor.After = afterExcutor;
            handlerExcutor.Error = errorExcutor;

            afterExcutor.Error = errorExcutor;

            // Оптимизация длины цепочки обработки запроса

            IHttpRequestExcutor firstExcutor = null;

            if (onBefore != null)
            {
                firstExcutor = beforeExcutor;
            }
            else if (onHandle != null)
            {
                firstExcutor = handlerExcutor;
            }
            else if (onAfter != null)
            {
                firstExcutor = afterExcutor;
            }

            // Формирование итогового обработчика запроса

            if (firstExcutor != null)
            {
                if (resultConverter != null)
                {
                    return(async request =>
                    {
                        var context = new HttpRequestExcutorContext(request);
                        await firstExcutor.Execute(context);

                        return resultConverter(context.Result);
                    });
                }

                return(async request =>
                {
                    var context = new HttpRequestExcutorContext(request);
                    await firstExcutor.Execute(context);

                    return context.Result;
                });
            }

            return(null);
        }