如何编写用于Rebus的中间件?

时间:2019-07-01 10:10:02

标签: rebus

我希望能够为Rebus编写自定义中间件,该中间件将包裹消息处理程序:在每个处理程序之前和之后执行,无论消息类型如何。 Rebus是否有可能,如果可以,我该怎么做?

浏览Rebus的源代码,我认为它应该 是可能的,因为该库围绕IPipeline的概念非常整洁并带有可定制的“步骤”。但是,尽管看起来很容易添加自定义步骤,但我找不到任何公开API的公共API。是否可以通过客户端代码修改管道?

我要寻找的基本上与MassTransit的IFilter<>等效。对于一个新项目,我们将在MassTransit和Rebus(或可能在Microsoft.Azure.ServiceBus之上的自定义实现)之间进行选择,目前,这似乎是Rebus缺少的主要功能。

1 个答案:

答案 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();