private async Task <bool> InvokeRouting(RoutableEventPipelines eventPipeline, TContext context, bool ignoreCompletion) { // obtain list of routing objects. IList <Routing <TContext, TRequest, TResponse> > routing; lock (Routing) { if (Routing.TryGetValue(eventPipeline, out routing) == false) { return(false); } } // obtain a snapshot of the routes. var routeCollections = new List <List <Route <TContext, TRequest, TResponse> > >(); lock (routing) { foreach (var r in routing) { routeCollections.Add(r.Routes.Where(_ => _.IsMatch(context)).ToList()); } } // invoke each route until one succeeds (unless ignoreCompletion). bool wasCompletedSuccessfully = false; foreach (var routeCollection in routeCollections) { foreach (var route in routeCollection) { if (await route.Invoke(context) == true) { if (ignoreCompletion == true) { wasCompletedSuccessfully = true; break; } else { return(true); } } } } return(wasCompletedSuccessfully); }
/// <summary> /// Synonym for AppendRoutingToEventPipeline. /// </summary> public RoutableOptions <TContext, TRequest, TResponse> AddRouting(RoutableEventPipelines eventPipeline, Routing <TContext, TRequest, TResponse> routing) => AppendRoutingToEventPipeline(eventPipeline, routing);
/// <summary> /// Prepend a routing instance to handle requests to the specified pipeline. /// </summary> /// <seealso cref="RoutableEventPipelines"/> public RoutableOptions <TContext, TRequest, TResponse> PrependRoutingToEventPipeline(RoutableEventPipelines eventPipeline, Routing <TContext, TRequest, TResponse> routing) { var list = GetEventPipelineRouting(eventPipeline); lock (list) { list.Insert(0, routing); } return(this); }
private IList <Routing <TContext, TRequest, TResponse> > GetEventPipelineRouting(RoutableEventPipelines eventPipeline) { lock (Routing) { if (Routing.TryGetValue(eventPipeline, out var list) == false) { list = new List <Routing <TContext, TRequest, TResponse> >(); Routing.Add(eventPipeline, list); return(list); } else { return(list); } } }