private bool TryGetHandlingMember(MethodInfo member, out MessageHandlerActionDescriptor descriptor) { var parameters = member.GetParameters(); if (parameters.Length == 0) { descriptor = default; return(false); } if (parameters.Any(p => p.ParameterType.IsByRef)) { descriptor = default; return(false); } if (member.IsGenericMethod || member.IsGenericMethodDefinition) { descriptor = default; return(false); } if (member.IsDefined <NoActionAttribute>()) { descriptor = default; return(false); } var messageType = parameters[0].ParameterType; var actionAttribute = member.GetCustomAttribute <ActionAttribute>(); if (actionAttribute != null && actionAttribute.MessageType != null) { if (!messageType.IsAssignableFrom(actionAttribute.MessageType)) { throw new InvalidOperationException(); } messageType = actionAttribute.MessageType; } var returnTypeDescriptor = TypeDescriptor.GetTypeDescriptor(member.ReturnType); if (IsSychronousHandler(member, actionAttribute, returnTypeDescriptor) || IsAsynchronousHandler(member, actionAttribute, returnTypeDescriptor)) { descriptor = new MessageHandlerActionDescriptor(messageType, _type, member); return(true); } descriptor = default; return(false); }
private static IMessageHandler CreateInvokerInternal( object handler, MessageHandlerActionDescriptor memberDescriptor, ImmutableArray <IContextualProvider <IMessageProcessor> > processors, IServiceProvider serviceProvider) { var messageType = memberDescriptor.MessageType; var factory = _factories.GetOrAdd(messageType, _factoryBuilderCache); return(factory(handler, memberDescriptor, processors, serviceProvider)); }
protected override void ConfigureMessageHandler(MessageHandlerActionDescriptor memberDescriptor, IList <object> configuration) { var existing = configuration.OfType <TransientAttribute>().FirstOrDefault(); if (existing != null) { configuration.Remove(existing); Assert(!configuration.OfType <TransientAttribute>().Any()); } configuration.Add(this); }
public async Task WithTaskResultTest() { var services = new ServiceCollection(); var serviceProvider = services.BuildServiceProvider(); var messageHandler = new MessageHandler(); var method = typeof(MessageHandler).GetMethod("HandleAsync", new[] { typeof(MessageY) }); var descriptor = new MessageHandlerActionDescriptor(typeof(MessageX), method); var invoker = new MessageHandlerInvoker <MessageY>(messageHandler, descriptor, ImmutableArray <IContextualProvider <IMessageProcessor> > .Empty, serviceProvider); var dispatchResult = await invoker.HandleAsync(new MessageY { I = 34 }, new DispatchValueDictionary()); Assert.IsTrue(dispatchResult.IsSuccess); }
public MessageProcessorContext( object messageHandler, MessageHandlerActionDescriptor messageHandlerAction, bool publish, bool isLocalDispatch) { if (messageHandler == null) { throw new ArgumentNullException(nameof(messageHandler)); } MessageHandler = messageHandler; MessageHandlerAction = messageHandlerAction; IsPublish = publish; IsLocalDispatch = isLocalDispatch; }
public async Task WithDispatchResultTaskTest() { var services = new ServiceCollection(); var serviceProvider = services.BuildServiceProvider(); var messageHandler = new MessageHandler(); var method = typeof(MessageHandler).GetMethod("HandleAsync", new[] { typeof(MessageX) }); var descriptor = new MessageHandlerActionDescriptor(typeof(MessageX), method); var invoker = new MessageHandlerInvoker <MessageX>(messageHandler, descriptor, ImmutableArray <IContextualProvider <IMessageProcessor> > .Empty, serviceProvider); var dispatchResult = await invoker.HandleAsync(new MessageX(), new DispatchValueDictionary()); Assert.IsTrue(dispatchResult.IsSuccess); Assert.IsInstanceOfType(dispatchResult, typeof(SuccessDispatchResult <int>)); Assert.AreEqual(42, ((SuccessDispatchResult <int>)dispatchResult).Result); }
public static IMessageHandler CreateInvoker( MessageHandlerActionDescriptor memberDescriptor, ImmutableArray <IContextualProvider <IMessageProcessor> > processors, IServiceProvider serviceProvider) { if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } var handlerType = memberDescriptor.MessageHandlerType; var handler = ActivatorUtilities.CreateInstance(serviceProvider, handlerType); Assert(handler != null); return(CreateInvokerInternal(handler, memberDescriptor, processors, serviceProvider)); }
public static IMessageHandler CreateInvoker( object handler, MessageHandlerActionDescriptor memberDescriptor, ImmutableArray <IContextualProvider <IMessageProcessor> > processors, IServiceProvider serviceProvider) { if (handler == null) { throw new ArgumentNullException(nameof(handler)); } if (handler.GetType() != memberDescriptor.MessageHandlerType) { throw new ArgumentException($"The object must be of type {memberDescriptor.MessageHandlerType}", nameof(handler)); } if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } return(CreateInvokerInternal(handler, memberDescriptor, processors, serviceProvider)); }