Example #1
0
        public static MessageHandlerDecoratorChainBuilder StartingWith(IMessageHandlerDecorator smh)
        {
            var b = new MessageHandlerDecoratorChainBuilder();

            b.Add(smh);
            return(b);
        }
        public Action <SubscriberIdAndMessage, IServiceProvider> Decorate(MessageHandler messageHandler)
        {
            MessageHandlerDecoratorChainBuilder builder = MessageHandlerDecoratorChainBuilder.StartingWith(_decorators[0]);

            foreach (IMessageHandlerDecorator mhd in _decorators.Skip(1))
            {
                builder = builder.AndThen(mhd);
            }

            IMessageHandlerDecoratorChain chain = builder.AndFinally((smh, serviceProvider) => {
                String subscriberId = smh.SubscriberId;
                IMessage message    = smh.Message;
                try {
                    _logger.LogTrace($"Invoking handler {subscriberId} {message.Id}");
                    messageHandler(smh.Message, serviceProvider);
                    _logger.LogTrace($"handled message {subscriberId} {message.Id}");
                } catch (Exception e) {
                    _logger.LogTrace($"Got exception {subscriberId} {message.Id}: {e}");
                    throw;
                }
            });

            return((subscriberIdAndMessage, serviceProvider) => chain.InvokeNext(subscriberIdAndMessage, serviceProvider));
        }