Resequencer для MediatR INotificationHandler - невозможно использовать IPipelineBehavior - PullRequest
2 голосов
/ 11 марта 2020

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

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

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

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

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

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.

1 Ответ

2 голосов
/ 11 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...