public IEnumerable <IMessagePump> CreateAll() { var openGenericHandlerType = typeof(IHandleRequest <,>); var handlerTypes = _typeProvider.RequestHandlerTypes.ToArray(); // Create a single connection to each request queue determined by routing var allMessageTypesHandledByThisEndpoint = _handlerMapper.GetMessageTypesHandledBy(openGenericHandlerType, handlerTypes); var bindings = allMessageTypesHandledByThisEndpoint .Select(m => new { MessageType = m, QueuePath = _router.Route(m, QueueOrTopic.Queue, _pathFactory) }) .GroupBy(b => b.QueuePath) .Select(g => new { QueuePath = g.Key, HandlerTypes = g.SelectMany(x => _handlerMapper.GetHandlerTypesFor(openGenericHandlerType, x.MessageType)) }); // Each binding to a queue can handle one or more request types depending on the routes that are defined foreach (var binding in bindings) { var messageTypes = _handlerMapper.GetMessageTypesHandledBy(openGenericHandlerType, binding.HandlerTypes).ToArray(); _logger.Debug("Creating message pump for request queue '{0}' handling {1}", binding.QueuePath, messageTypes.ToTypeNameSummary(selector: t => t.Name)); var messageReceiver = _transport.GetQueueReceiver(binding.QueuePath); var handlerMap = _handlerMapper.GetHandlerMapFor(openGenericHandlerType, messageTypes); var messageDispatcher = _messageDispatcherFactory.Create(openGenericHandlerType, handlerMap); var pump = _container.ResolveWithOverrides <MessagePump>(messageReceiver, messageDispatcher); GarbageMan.Add(pump); yield return(pump); } }
public IMessagePump Create() { var pump = _container.ResolveWithOverrides <MessagePump>(_transport.GetQueueReceiver(_replyQueueName), _responseMessageDispatcher); GarbageMan.Add(pump); return(pump); }