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