我使用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会再次开始工作。
有关调解传奇和处理程序装饰者的任何建议吗?
答案 0 :(得分:1)
不幸的是,正如您所发现的那样,Rebus并不期望处理程序(包括传单)可以包装在装饰器中。
它在内部对各种事物使用装饰器很多,它鼓励使用装饰器作为开发人员的扩展点,但这只适用于所有Rebus的服务,如IPipeline
,ISubscriptionStorage
,等
如果您想记录与消息处理相关的内容,则可以使用更好的扩展点
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();