如何为 Rebus 编写中间件?

How do I write middleware for Rebus?

我希望能够为 Rebus 编写自定义中间件,它将环绕消息处理程序:在每个处理程序之前和之后执行,无论消息类型如何。 Rebus 可以做到这一点吗?如果可以,我该怎么做?

浏览 Rebus 的源代码,我认为 应该 是可能的,因为库是围绕 IPipeline 的概念构建的,具有可定制的 [=23] =].但是,尽管 看起来 添加自定义步骤应该很容易,但我找不到任何 public API 公开管道。是否可以从客户端代码修改管道?

我正在寻找的基本上等同于 MassTransit 的 IFilter<>。我们即将为一个新项目在 MassTransit 和 Rebus(或者可能是 Microsoft.Azure.ServiceBus 之上的自定义实现)之间做出选择,目前这看起来像是 Rebus 缺少的主要功能。

使用 Rebus,您可以通过修饰 IPipeline 添加自定义步骤,这使得可以根据需要更改传入和传出消息管道。

为了更方便地将步骤注入管道中的特定位置,Rebus 提供了一个 PipelineStepInjector,它是一个装饰器,可以相对于另一个步骤定位注入的步骤。

查看 the Pipelines section on the wiki page about extensibility – 它展示了如何使用传出步骤自动丰富所有传出消息的 headers。

传入的步骤可以用类似的方式添加,只是使用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();