Resequencer для MediatR INotificationHandler — не может использовать IPipelineBehavior

Я видел MediatR IPipelineBehavior<TRequest, TResponse> и хочу использовать resequencer для упорядочения уведомлений шины событий. Аспектно-ориентированный угол очень интересен/полезен для разделения функциональности на отдельные обработчики.

Я вижу упоминание документов:

поведение конвейера совместимо только с IRequestHandler<TRequest,TResponse> и не может использоваться с INotificationHandler<TRequest>.

Как можно было бы обойти это, есть ли эквивалентный конвейер поведения/преобразования для INotification и INotificationHandler?

Или можно использовать контейнер DI, такой как мой любимый SimpleInjector, и зарегистрировать декораторы для переноса определенных обработчиков событий, где я хочу, чтобы повторная последовательность происходила путем переноса определенных обработчиков уведомлений?

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

Просто пытаюсь найти лучшее место для этого, поскольку кажется, что это можно сделать (по крайней мере, с помощью IRequests) как в MediatR, так и в SimpleInjector.


person morleyc    schedule 11.03.2020    source источник
comment
Хорошо, спасибо, Стивен, если вы хотите использовать это как ответ, это именно то, что я искал, и я отмечу его соответствующим образом.   -  person morleyc    schedule 11.03.2020


Ответы (1)


Лично я бы, конечно, отказался от такого поведения конвейера и заменил бы его декораторами. Декораторы создают гораздо более простую модель для реализации сквозных задач. Старые версии MediatR фактически использовали декораторы вместо этого поведения конвейера. Насколько мне известно, единственная причина, по которой более новые версии MediatR не используют декораторы, заключается в том, что они пытаются создать модель, которая работает со всеми контейнерами, даже с теми, которые плохо поддерживают декораторы (например, MS.DI, Unity и т. д.).

person Steven    schedule 11.03.2020
comment
Спасибо, Стивен, также с помощью декораторов я могу обернуть INotification, что мне и нужно сделать в этом случае. - person morleyc; 12.03.2020