MediatR INotificationHandler 的重新排序器 - 无法使用 IPipelineBehavior
Resequencer for MediatR INotificationHandler - can't use IPipelineBehavior
我看过 MediatR IPipelineBehavior<TRequest, TResponse>
并希望使用重新排序器来整理事件总线通知。面向方面的角度非常 interesting/useful 可以将功能拆分为单独的处理程序。
我可以看到文档提到:
pipeline behaviors are only compatible with
IRequestHandler<TRequest,TResponse>
and can't be used with
INotificationHandler<TRequest>
.
如果 INotification
和 INotificationHandler
有一个等效的 behaviors/transformation 管道,解决这个问题的方法是什么?
或者是否会使用 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;
}
}
只是想找出执行此操作的最佳位置,因为似乎能够在 MediatR
和 SimpleInjector
.
中执行此操作(至少使用 IRequests)
就个人而言,我肯定会放弃那些管道行为并用装饰器替换它们。装饰器创建了一个更简单的模型来实现横切关注点。旧版本的 MediatR 实际上使用了装饰器而不是这些管道行为。据我所知,较新的 MediatR 版本不使用装饰器的唯一原因是因为它试图制作一个适用于所有容器的模型,即使是那些对装饰器支持不佳的容器(例如 MS.DI、Unity 等) .
我看过 MediatR IPipelineBehavior<TRequest, TResponse>
并希望使用重新排序器来整理事件总线通知。面向方面的角度非常 interesting/useful 可以将功能拆分为单独的处理程序。
我可以看到文档提到:
pipeline behaviors are only compatible with
IRequestHandler<TRequest,TResponse>
and can't be used withINotificationHandler<TRequest>
.
如果 INotification
和 INotificationHandler
有一个等效的 behaviors/transformation 管道,解决这个问题的方法是什么?
或者是否会使用 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;
}
}
只是想找出执行此操作的最佳位置,因为似乎能够在 MediatR
和 SimpleInjector
.
就个人而言,我肯定会放弃那些管道行为并用装饰器替换它们。装饰器创建了一个更简单的模型来实现横切关注点。旧版本的 MediatR 实际上使用了装饰器而不是这些管道行为。据我所知,较新的 MediatR 版本不使用装饰器的唯一原因是因为它试图制作一个适用于所有容器的模型,即使是那些对装饰器支持不佳的容器(例如 MS.DI、Unity 等) .