예제 #1
0
        /// <summary>
        /// Selects a <see cref="EventHandlerDescriptor"/> for the given <see cref="HandlerRequest"/>.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>An <see cref="EventHandlerDescriptor"/> instance.</returns>
        public EventHandlersDescriptor SelectHandlers(EventHandlerRequest request)
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            EventHandlersDescriptor result;
            if (!this.handlerInfoCache.Value.TryGetValue(request.MessageType, out result))
            {
                throw Error.InvalidOperation(Resources.DefaultHandlerSelector_HandlerNotFound, request.MessageType.Name);
            }

            return result;
        }
예제 #2
0
        /// <summary>
        /// Selects a <see cref="EventHandlerDescriptor"/> for the given <see cref="HandlerRequest"/>.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>An <see cref="EventHandlerDescriptor"/> instance.</returns>
        public EventHandlersDescriptor SelectHandlers(EventHandlerRequest request)
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            EventHandlersDescriptor result;

            if (!this.handlerInfoCache.Value.TryGetValue(request.MessageType, out result))
            {
                throw Error.InvalidOperation(Resources.DefaultHandlerSelector_HandlerNotFound, request.MessageType.Name);
            }

            return(result);
        }
예제 #3
0
        /// <summary>
        /// Execute the request via the worker. 
        /// </summary>
        /// <param name="request">The <see cref="EventHandlerRequest"/> to execute.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to cancel the execution.</param>
        /// <returns>The <see cref="Task"/> of the event.</returns>
        public async Task PublishAsync(EventHandlerRequest request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            IEventHandlerSelector handlerSelector = this.Configuration.Services.GetEventHandlerSelector();

            EventHandlersDescriptor eventDescriptor = handlerSelector.SelectHandlers(request);

            var descriptors = eventDescriptor.EventHandlerDescriptors;
            for (int i = 0; i < descriptors.Count; i++)
            {
                await InvokeHandlerAsync(descriptors[i], request, cancellationToken);
            }
        }
예제 #4
0
        /// <summary>
        /// Execute the request via the worker.
        /// </summary>
        /// <param name="request">The <see cref="EventHandlerRequest"/> to execute.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to cancel the execution.</param>
        /// <returns>The <see cref="Task"/> of the event.</returns>
        public async Task PublishAsync(EventHandlerRequest request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            IEventHandlerSelector handlerSelector = this.Configuration.Services.GetEventHandlerSelector();

            EventHandlersDescriptor eventDescriptor = handlerSelector.SelectHandlers(request);

            var descriptors = eventDescriptor.EventHandlerDescriptors;

            for (int i = 0; i < descriptors.Count; i++)
            {
                await InvokeHandlerAsync(descriptors[i], request, cancellationToken);
            }
        }
예제 #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CommandHandlerContext"/> class.
        /// </summary>
        /// <param name="request">The handler request.</param>
        /// <param name="descriptor">The handler descriptor.</param>
        public EventHandlerContext(EventHandlerRequest request, EventHandlerDescriptor descriptor)
            : this()
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            if (request.Configuration == null)
            {
                throw Error.Argument("request");
            }

            this.Configuration = request.Configuration;
            this.Request       = request;
            this.Event         = request.Event;
            this.Descriptor    = descriptor;
            this.User          = this.Configuration.Services.GetPrincipalProvider().Principal;
        }
예제 #6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CommandHandlerContext"/> class. 
        /// </summary>
        /// <param name="request">The handler request.</param>
        /// <param name="descriptor">The handler descriptor.</param>
        public EventHandlerContext(EventHandlerRequest request, EventHandlerDescriptor descriptor)
            : this()
        {
            if (request == null)
            {
                throw Error.ArgumentNull("request");
            }

            if (request.Configuration == null)
            {
                throw Error.Argument("request");
            }

            this.Configuration = request.Configuration;
            this.Request = request;
            this.Event = request.Event;
            this.Descriptor = descriptor;
            this.User = this.Configuration.Services.GetPrincipalProvider().Principal;
        }
예제 #7
0
        private static Task InvokeHandlerAsync(EventHandlerDescriptor descriptor, EventHandlerRequest request, CancellationToken cancellationToken)
        {
            Contract.Requires(descriptor != null);
            Contract.Requires(request != null);

            IEventHandler handler = descriptor.CreateHandler(request);
            if (handler == null)
            {
                throw CreateHandlerNotFoundException(descriptor);
            }

            request.RegisterForDispose(handler, true);
            EventHandlerContext context = new EventHandlerContext(request, descriptor);
            context.Handler = handler;
            handler.EventContext = context;
            EventFilterGrouping filterGrouping = descriptor.GetFilterGrouping();
     
            ServicesContainer servicesContainer = request.Configuration.Services;
            IEventHandlerResult result = new EventHandlerFilterResult(context, servicesContainer, filterGrouping.EventHandlerFilters);

            return result.ExecuteAsync(cancellationToken);
        }
예제 #8
0
        private static Task InvokeHandlerAsync(EventHandlerDescriptor descriptor, EventHandlerRequest request, CancellationToken cancellationToken)
        {
            Contract.Requires(descriptor != null);
            Contract.Requires(request != null);

            IEventHandler handler = descriptor.CreateHandler(request);

            if (handler == null)
            {
                throw CreateHandlerNotFoundException(descriptor);
            }

            request.RegisterForDispose(handler, true);
            EventHandlerContext context = new EventHandlerContext(request, descriptor);

            context.Handler      = handler;
            handler.EventContext = context;
            EventFilterGrouping filterGrouping = descriptor.GetFilterGrouping();

            ServicesContainer   servicesContainer = request.Configuration.Services;
            IEventHandlerResult result            = new EventHandlerFilterResult(context, servicesContainer, filterGrouping.EventHandlerFilters);

            return(result.ExecuteAsync(cancellationToken));
        }
예제 #9
0
 /// <summary>
 /// Creates a handler instance for the given <see cref="HandlerRequest"/>.
 /// </summary>
 /// <param name="request">The request.</param>
 /// <returns>The created handler instance.</returns>
 public virtual IEventHandler CreateHandler(EventHandlerRequest request)
 {
     return(this.handlerActivator.Create(request, this));
 }