private async Task ConnectToHandler(TContext context)
        {
            var handlers = MessageHandlerRegistry.MessageBindings.Where(x => x.MessageType == context.Message.GetType()).ToList();

            if (!handlers.Any())
            {
                throw new NoHandlerFoundException(context.Message.GetType());
            }

            if (handlers.Count() > 1)
            {
                throw new MoreThanOneHandlerException(context.Message.GetType());
            }


            foreach (var x in handlers)
            {
                var handlerType = x.HandlerType;
                var messageType = context.Message.GetType();

                var handleMethod = handlerType.GetRuntimeMethods().Single(m =>
                {
                    var result = m.Name == "Handle" && m.IsPublic && m.GetParameters().Any() &&
                                 (m.GetParameters()[0].ParameterType.GenericTypeArguments.Contains(messageType) || m.GetParameters()[0].ParameterType.GenericTypeArguments.First().GetTypeInfo().IsAssignableFrom(messageType.GetTypeInfo()));
                    return(result);
                });

                var handler = (_resolver == null) ? Activator.CreateInstance(handlerType) : _resolver.Resolve(handlerType);
                var task    = (Task)handleMethod.Invoke(handler, new object[] { context });
                await task.ConfigureAwait(false);
            }
        }
示例#2
0
        private Task <object> ConnectToHandler(TContext context)
        {
            var handlers =
                MessageHandlerRegistry.MessageBindings.Where(
                    x => x.MessageType == context.Message.GetType()).ToList();

            if (!handlers.Any())
            {
                throw new NoHandlerFoundException(context.Message.GetType());
            }

            if (handlers.Count() > 1)
            {
                throw new MoreThanOneHandlerException(context.Message.GetType());
            }

            var binding = handlers.Single();

            var handlerType = binding.HandlerType;
            var messageType = context.Message.GetType();

            var handleMethods = handlerType.GetRuntimeMethods().Where(m => m.Name == "Handle");
            var handleMethod  = handleMethods.Single(y =>
            {
                var parameterTypeIsCorrect = y.GetParameters().Single()
                                             .ParameterType.GenericTypeArguments.First()
                                             .GetTypeInfo()
                                             .IsAssignableFrom(messageType.GetTypeInfo());

                return(parameterTypeIsCorrect &&
                       y.IsPublic &&
                       ((y.CallingConvention & CallingConventions.HasThis) != 0));
            });

            var handler = (_resolver == null) ? Activator.CreateInstance(handlerType) : _resolver.Resolve(handlerType);
            var task    = (Task)handleMethod.Invoke(handler, new object[] { context });

            var taskType = task.GetType();
            var typeInfo = taskType.GetTypeInfo();

            var resultProperty = typeInfo.GetDeclaredProperty("Result").GetMethod;
            var result         = resultProperty.Invoke(task, new object[] { });

            return(Task.FromResult(result));
        }