我希望能够为Rebus编写自定义中间件,该中间件将包裹消息处理程序:在每个处理程序之前和之后执行,无论消息类型如何。 Rebus是否有可能,如果可以,我该怎么做?
浏览Rebus的源代码,我认为它应该 是可能的,因为该库围绕IPipeline
的概念非常整洁并带有可定制的“步骤”。但是,尽管看起来很容易添加自定义步骤,但我找不到任何公开API的公共API。是否可以通过客户端代码修改管道?
我要寻找的基本上与MassTransit的IFilter<>
等效。对于一个新项目,我们将在MassTransit和Rebus(或可能在Microsoft.Azure.ServiceBus
之上的自定义实现)之间进行选择,目前,这似乎是Rebus缺少的主要功能。
答案 0 :(得分:1)
使用Rebus,您可以通过装饰IPipeline
来添加自定义步骤,从而可以根据需要更改传入和传出消息管道。
为了更方便地将步骤注入到管道中的特定位置,Rebus附带了PipelineStepInjector
,这是一个装饰器,可以将注入的步骤相对于另一个步骤定位。
签出the Pipelines section on the wiki page about extensibility-它显示了如何使用传出步骤自动充实所有传出邮件的标题。
可以仅使用OnReceive
方法而不是OnSend
来添加步骤,以类似的方式添加传入步骤:
Configure.With(...)
.(...)
.Options(o => {
o.Decorate<IPipeline>(c =>
{
var pipeline = c.Get<IPipeline>();
var step = new YourIncomingStep();
return new PipelineStepInjector(pipeline)
.OnReceive(step, PipelineRelativePosition.Before, typeof(DispatchIncomingMessageStep));
});
})
.Start();