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 Run(PerformContext context, IJobPerformStrategy strategy) { var filterInfo = GetFilters(context.MethodData); try { PerformJobWithFilters(context, strategy, filterInfo.ServerFilters); } catch (Exception ex) { var exceptionContext = new ServerExceptionContext(context, ex); InvokeServerExceptionFilters(exceptionContext, filterInfo.ServerExceptionFilters); if (!exceptionContext.ExceptionHandled) { throw; } } }