private static void PerformJobWithFilters( PerformContext context, IJobPerformStrategy strategy, IEnumerable<IServerFilter> filters) { var preContext = new PerformingContext(context); Func<PerformedContext> continuation = () => { strategy.Perform(); return new PerformedContext(context, false, null); }; var thunk = filters.Reverse().Aggregate(continuation, (next, filter) => () => InvokePerformFilter(filter, preContext, next)); thunk(); }
public void OnPerforming(PerformingContext filterContext) { if (filterContext == null) throw new ArgumentNullException("filterContext"); var cultureName = filterContext .GetJobParameter<string>("CurrentCulture"); var uiCultureName = filterContext .GetJobParameter<string>("CurrentUICulture"); var thread = Thread.CurrentThread; if (!String.IsNullOrEmpty(cultureName)) { filterContext.Items["PreviousCulture"] = thread.CurrentCulture; thread.CurrentCulture = CultureInfo.GetCultureInfo(cultureName); } if (!String.IsNullOrEmpty(uiCultureName)) { filterContext.Items["PreviousUICulture"] = thread.CurrentUICulture; thread.CurrentUICulture = CultureInfo.GetCultureInfo(uiCultureName); } }
private static PerformedContext InvokePerformFilter( IServerFilter filter, PerformingContext preContext, Func<PerformedContext> continuation) { try { filter.OnPerforming(preContext); } catch (Exception filterException) { throw new JobPerformanceException( "An exception occurred during execution of one of the filters", filterException); } if (preContext.Canceled) { return new PerformedContext( preContext, true, null); } var wasError = false; PerformedContext postContext; try { postContext = continuation(); } catch (Exception ex) { wasError = true; postContext = new PerformedContext( preContext, false, ex); try { filter.OnPerformed(postContext); } catch (Exception filterException) { throw new JobPerformanceException( "An exception occurred during execution of one of the filters", filterException); } if (!postContext.ExceptionHandled) { throw; } } if (!wasError) { filter.OnPerformed(postContext); } return postContext; }