コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
            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;
            }
コード例 #6
0
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        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));
        }