Example #1
0
        private bool TryNakedHandler <TResult>(IRequest request, CancellationToken token, out Task <Response <TResult> > task)
        {
            try
            {
                var requestType = request.GetType();
                var handlerType = typeof(IRequestHandler <>).MakeGenericType(requestType);

                var internalHandler = typeof(DynamicDispatchMediator)
                                      .GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
                                      .SingleOrDefault(x => x.Name == nameof(DispatchAsync) && x.GetGenericArguments().Length == 1)
                                      .MakeGenericMethod(requestType);

                task = (Task <Response <TResult> >)internalHandler.Invoke(this, new object[] { request, handlerType, token });

                _handlerCache[requestType] = new HandlerCacheItem
                {
                    HandlerMethod = internalHandler,
                    RequestType   = requestType,
                    HandlerType   = handlerType
                };

                return(true);
            }
            catch
            {
                task = null;
                return(false);
            }
        }
Example #2
0
        public Task <Response <TResult> > HandleAsync <TResult>(IRequest <TResult> request, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            var requestType = request.GetType();

            if (_handlerCache.TryGetValue(requestType, out var cachedItem))
            {
                return((Task <Response <TResult> >)cachedItem.HandlerMethod.Invoke(this, new object[] { request, cachedItem.HandlerType, token }));
            }

            if (typeof(TResult) == typeof(NoResult) && TryNakedHandler <TResult>((IRequest)request, token, out var handleTask))
            {
                return(handleTask);
            }

            var handlerType = typeof(IRequestHandler <,>).MakeGenericType(requestType, typeof(TResult));

            var internalHandler = typeof(DynamicDispatchMediator)
                                  .GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
                                  .SingleOrDefault(x => x.Name == nameof(DispatchAsync) && x.GetGenericArguments().Length == 2)
                                  .MakeGenericMethod(requestType, typeof(TResult));

            _handlerCache[requestType] = new HandlerCacheItem
            {
                HandlerMethod = internalHandler,
                RequestType   = requestType,
                HandlerType   = handlerType
            };

            return((Task <Response <TResult> >)internalHandler.Invoke(this, new object[] { request, handlerType, token }));
        }
 public HandlerCacheItemFixture()
 {
     _cacheItem = new HandlerCacheItem
     {
         Content = Content
     };
 }
Example #4
0
 protected virtual void TryHandleMessage(object message, IServiceLocator serviceLocator, HandlerCacheItem messageHandlerDetail, IEnumerable<Type> contracts, List<object> handlers)
 {
     try
     {
         Logger.Debug("Dispatching {0} to {1}", message.GetType().FullName, messageHandlerDetail.HandlerType.FullName);
         object messageHandler = messageHandlerDetail.TryHandleMessage(serviceLocator, message, contracts);
         handlers.Add(messageHandler);
     }
     catch (ProcessManagerDataNotFoundException ex)
     {
         Logger.Warn(ex.Message);
     }
 }
Example #5
0
        public static void SaveHandlerDetails(Type handlerType, Type messageContract, Action<object, object> handlerAction)
        {
            if(handlerAction == null)
                return;

            HandlerCacheItem details = handlerDetails.FirstOrDefault(detail => detail.HandlerType == handlerType);

            if (details == null)
            {
                details = new HandlerCacheItem(handlerType);
                handlerDetails.Add(details);
            }

            details.AddHandlerAction(messageContract, handlerAction);
        }
Example #6
0
        private static void SaveHandlerAction(Type handlerType, Type messageContract, Action<object, object> handlerAction)
        {
            if(handlerAction == null)
                return;

            if (Settings.IsCommandType != null && Settings.IsCommandType(messageContract))
            {
                if (HandlerDetails.Any(d => d.ContainsHandlerFor(messageContract)))
                {
                    throw new HermesComponentRegistrationException(String.Format("A command may only be handled by one class. A duplicate command handler for command {0} was found on class {1}.", messageContract.Name, handlerType.FullName));
                }
            }

            HandlerCacheItem details = HandlerDetails.FirstOrDefault(detail => detail.HandlerType == handlerType);

            if (details == null)
            {
                details = new HandlerCacheItem(handlerType);
                HandlerDetails.Add(details);
            }

            details.AddHandlerAction(messageContract, handlerAction);
        }