ReBus:无法使用传奇与处理程序装饰

时间:2017-07-12 07:30:57

标签: decorator rebus saga

我使用Rebus 3.0.1和Simpleinjector。我已经注册了一个装饰器,用于记录所有处理程序,这样:

container.RegisterDecorator(typeof(IHandleMessages<>), typeof(HandlerLogDecorator<>));


除了Sagas之外,一切正常:因为,在 LoadSagaDataStep 中,以下代码

            var handlerInvokersForSagas = context.Load<HandlerInvokers>()
            .Where(l => l.HasSaga)
            .ToList();

无法找到封面下的Saga 如果我取消注册装饰器,saga会再次开始工作。

有关调解传奇和处理程序装饰者的任何建议吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,正如您所发现的那样,Rebus并不期望处理程序(包括传单)可以包装在装饰器中。

它在内部对各种事物使用装饰器很多,它鼓励使用装饰器作为开发人员的扩展点,但这只适用于所有Rebus的服务,如IPipelineISubscriptionStorage,等

如果您想记录与消息处理相关的内容,则可以使用更好的扩展点

a)使用Rebus.Events并简单地安装一个这样的事件处理程序:

Configure.With(...)
    .(...)
    .Events(e => {
        e.AfterMessageHandled += (bus, headers, message, context, args) => {
            // log stuff in here :)
        };
    })
    .Start();

b)创建一个传入管道步骤,记录您要记录的内容,如下所示:

Configure.With(...)
    .(...)
    .Options(o => {
        o.Decorate<IPipeline>(c => {
            var step = new YourLoggingStep();
            var pipeline = c.Get<IPipeline>();

            return new PipelineStepInjector(pipeline)
                .OnReceive(step, PipelineRelativePosition.After, typeof(DeserializeIncomingMessageStep));
        });
    })
    .Start();

可能在扩展方法中包含所有丑陋的东西,使得使用看起来更像这样:

Configure.With(...)
    .(...)
    .Options(o => {
        o.LogHandledMessages();
    })
    .Start();