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