Search code examples
c#simple-injectormediatr

Resequencer for MediatR INotificationHandler - can't use IPipelineBehavior


I have seen MediatR IPipelineBehavior<TRequest, TResponse> and looking to use a resequencer for event bus notifications to be put in order. The aspect orientated angle is very interesting/useful to split up functionality into separate handlers.

I can see the docs mention:

pipeline behaviors are only compatible with IRequestHandler<TRequest,TResponse> and can't be used with INotificationHandler<TRequest>.

What would be the way around this is there an equivalent behaviors/transformation pipeline for INotification and INotificationHandler?

Or would one use a DI container such as my favorite SimpleInjector and register decorators to wrap specific event handlers where i want re-sequencing to take place by wrapping specific notification handlers?

class ResequencerEventHandler<T> : INotificationHandler<T> where T : INotification, ISequencedMessage
{
   readonly IResequencer _resequencer;
   readonly INotificationHandler<T> _handler;

   public ResequencerEventHandler(INotificationHandler<T> handler, IResequencer resequencer)
   {
      _resequencer = resequencer;
      _handler = handler;
   }

   public Task Handle(T notification)
   {
      _resequencer.Add(notification);

      while(_resequencer.CanDequeue)
      {
          var packet = _resequencer.Dequeue();
          _handler(packet);
      }

      return Task.CompletedTask;
   }
}

Just trying to work out the best place to do this, as seem to be able to do this (with IRequests at least) both in MediatR and SimpleInjector.


Solution

  • Personally, I would certainly ditch those pipeline behaviors and replace them with decorators. Decorators make a much simpler model to implement cross-cutting concerns. Older versions of MediatR actually used decorators instead of these pipeline behavior. AFAIK, the only reason newer MediatR versions don't use decorators is because it tries to make a model that works on all containers, even on those that have poor support for decorators (such as MS.DI, Unity, etc.).