/// <summary> /// Registers a dynamic event handler. /// </summary> /// <typeparam name="TEvent">The type of the <see cref="IEvent"/>.</typeparam> /// <param name="config">The configuration.</param> /// <param name="handler">The <see cref="Func{TEvent, Task}"/> delegate.</param> public static void RegisterEventHandler <TEvent>(this ProcessorConfiguration config, Func <TEvent, Task> handler) where TEvent : IEvent { if (config == null) { throw Error.ArgumentNull("config"); } if (handler == null) { throw Error.ArgumentNull("handler"); } var descriptorProvider = config.Services.GetEventHandlerDescriptorProvider(); var mapping = descriptorProvider.GetHandlerMapping(); Type eventType = typeof(TEvent); EventHandlersDescriptor descriptors; if (!mapping.TryGetValue(eventType, out descriptors)) { descriptors = new EventHandlersDescriptor(eventType.Name); mapping.Add(typeof(TEvent), descriptors); } descriptors.EventHandlerDescriptors.Add(new EventHandlerDescriptor <TEvent>(config, eventType, handler)); }
EventHandlersDescriptor IEventHandlerSelector.SelectHandlers(EventHandlerRequest request) { EventHandlersDescriptor eventDescriptor = null; this.traceWriter.TraceBeginEnd( request, TraceCategories.HandlersCategory, TraceLevel.Info, this.innerSelector.GetType().Name, SelectActionMethodName, beginTrace: null, execute: () => eventDescriptor = this.innerSelector.SelectHandlers(request), endTrace: tr => { tr.Message = Error.Format( Resources.TraceHandlerSelectedMessage, FormattingUtilities.EventHandlerDescriptorsToString(eventDescriptor.EventHandlerDescriptors)); }, errorTrace: null); Collection <EventHandlerDescriptor> handlerDescriptors = new Collection <EventHandlerDescriptor>(); foreach (var handlerDescriptor in eventDescriptor.EventHandlerDescriptors) { // Intercept returned EventHandlerDescriptor with a tracing version if (handlerDescriptor != null && !(handlerDescriptor is EventHandlerDescriptorTracer)) { handlerDescriptors.Add(new EventHandlerDescriptorTracer(handlerDescriptor, this.traceWriter)); } else { handlerDescriptors.Add(handlerDescriptor); } } return(new EventHandlersDescriptor(eventDescriptor.EventName, handlerDescriptors)); }