예제 #1
0
 protected override void When()
 {
     errorHandler.DealWithPreviouslyOccurredExceptions(Context);
 }
예제 #2
0
        public Response[] Process(params Request[] requests)
        {
            if (requests == null)
            {
                return(null);
            }

            var exceptionsPreviouslyOccurred = false;

            BeforeProcessing(requests);

            var processingContexts = requests.Select(request => new RequestProcessingContext(request)).ToList();

            foreach (var requestProcessingState in processingContexts)
            {
                if (exceptionsPreviouslyOccurred)
                {
                    errorHandler.DealWithPreviouslyOccurredExceptions(requestProcessingState);
                    continue;
                }

                IList <IRequestHandlerInterceptor> interceptors        = new List <IRequestHandlerInterceptor>();
                IList <IRequestHandlerInterceptor> invokedInterceptors = new List <IRequestHandlerInterceptor>();

                try
                {
                    interceptors = ResolveInterceptors();
                    foreach (var interceptor in interceptors)
                    {
                        interceptor.BeforeHandlingRequest(requestProcessingState);
                        invokedInterceptors.Add(interceptor);
                        if (requestProcessingState.IsProcessed)
                        {
                            break;
                        }
                    }

                    if (!requestProcessingState.IsProcessed)
                    {
                        InvokeRequestHandler(requestProcessingState);
                    }
                }
                catch (Exception exc)
                {
                    logger.Error(exc.Message, exc);
                    exceptionsPreviouslyOccurred = true;
                    errorHandler.DealWithException(requestProcessingState, exc);
                }
                finally
                {
                    try
                    {
                        var possibleExceptionsFromInterceptors = RunInvokedInterceptorsSafely(requestProcessingState, invokedInterceptors);

                        if (possibleExceptionsFromInterceptors.Any())
                        {
                            foreach (var exceptionFromInterceptor in possibleExceptionsFromInterceptors)
                            {
                                logger.Error(exceptionFromInterceptor);
                            }
                            exceptionsPreviouslyOccurred = true;
                            errorHandler.DealWithException(requestProcessingState, possibleExceptionsFromInterceptors.ElementAt(0));
                        }
                    }
                    finally
                    {
                        DisposeInterceptorsSafely(interceptors);
                    }
                }
            }

            var responses = processingContexts.Select(c => c.Response).ToArray();

            AfterProcessing(requests, responses);

            return(responses);
        }
예제 #3
0
        public Response[] Process(params Request[] requests)
        {
            if (requests == null)
            {
                return(null);
            }

            var exceptionsPreviouslyOccurred = false;

            BeforeProcessing(requests);

            var processingContexts = requests.Select(request => new RequestProcessingContext(request)).ToList();

            foreach (var requestProcessingState in processingContexts)
            {
                if (exceptionsPreviouslyOccurred)
                {
                    errorHandler.DealWithPreviouslyOccurredExceptions(requestProcessingState);
                    continue;
                }
                IList <IRequestHandlerInterceptor> interceptors = new List <IRequestHandlerInterceptor>();
                try
                {
                    IList <IRequestHandlerInterceptor> invokedInterceptors = new List <IRequestHandlerInterceptor>();
                    interceptors = ResolveInterceptors();
                    foreach (var interceptor in interceptors)
                    {
                        interceptor.BeforeHandlingRequest(requestProcessingState);
                        invokedInterceptors.Add(interceptor);
                        if (requestProcessingState.IsProcessed)
                        {
                            break;
                        }
                    }

                    if (!requestProcessingState.IsProcessed)
                    {
                        exceptionsPreviouslyOccurred = InvokeRequestHandler(requestProcessingState);
                    }

                    foreach (var interceptor in invokedInterceptors.Reverse())
                    {
                        interceptor.AfterHandlingRequest(requestProcessingState);
                    }
                    invokedInterceptors.Clear();
                }
                catch (Exception exc)
                {
                    logger.Error(exc);
                    throw;
                }
                finally
                {
                    DisposeInterceptorsSafely(interceptors);
                }
            }
            var responses = processingContexts.Select(c => c.Response).ToArray();

            AfterProcessing(requests, responses);

            return(responses);
        }