Exemple #1
0
        /// <summary>
        /// Publish the event.
        /// </summary>
        /// <param name="event">The event to publish.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
        /// <param name="currentRequest">The current request. Pass null if there is not parent request.</param>
        /// <returns>The result of the event.</returns>
        internal async Task PublishAsync(IEvent @event, CancellationToken cancellationToken, HandlerRequest currentRequest)
        {
            if (@event == null)
            {
                throw Error.ArgumentNull("@event");
            }

            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }

            if (currentRequest == null)
            {
                throw Error.InvalidOperation("The event '{0}' cannot be publish directly. Process a {1} then publish this event into the 'Handle' method.", @event.GetType().Name, typeof(ICommand).Name);
            }

            IEventStore eventStore = this.Configuration.Services.GetServiceOrThrow <IEventStore>();

            await eventStore.StoreAsync(@event, cancellationToken);

            IEventWorker eventWorker = this.Configuration.Services.GetEventWorker();

            using (EventHandlerRequest request = new EventHandlerRequest(this.Configuration, @event, currentRequest))
            {
                request.Processor = new MessageProcessorWrapper(this, request);
                await eventWorker.PublishAsync(request, cancellationToken);
            }
        }
        public override IEventHandler CreateHandler(EventHandlerRequest request)
        {
            IEventHandler eventHandler = null;

            this.traceWriter.TraceBeginEnd(
                request,
                TraceCategories.HandlersCategory,
                TraceLevel.Info,
                this.innerDescriptor.GetType().Name,
                CreateHandlerMethodName,
                beginTrace: null,
                execute: () =>
            {
                eventHandler = this.innerDescriptor.CreateHandler(request);
            },
                endTrace: tr => tr.Message = eventHandler == null ? Resources.TraceNoneObjectMessage : this.innerDescriptor.HandlerType.FullName,
                errorTrace: null);

            if (eventHandler != null && !(eventHandler is EventHandlerTracer))
            {
                return(new EventHandlerTracer(request, eventHandler, this.traceWriter));
            }

            return(eventHandler);
        }
Exemple #3
0
 public Task PublishAsync(EventHandlerRequest request, CancellationToken cancellationToken)
 {
     return(this.TraceWriter.TraceBeginEnd(
                request,
                TraceCategories.RequestsCategory,
                TraceLevel.Info,
                this.Inner.GetType().Name,
                ExecuteMethodName,
                beginTrace: null,
                execute: () => this.Inner.PublishAsync(request, cancellationToken),
                endTrace: null,
                errorTrace: null));
 }
Exemple #4
0
        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));
        }