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); } }
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)); }