2017-07-12 81 views
1

我使用的是Simpleinjector的Rebus 3.0.1。我已經註冊了一個裝飾,日誌記錄,所有的處理程序,這種方式:ReBus:無法使用傳教士裝飾者

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


一切工作正常,除了傳奇故事:因爲在LoadSagaDataStep,下面的代碼

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

無法在封面下找到佐賀。
如果我註銷裝飾者,傳奇開始再次工作。

任何建議調解傳說和處理程序裝飾?

回答

1

不幸的是,正如你所發現的,Rebus不希望處理程序(包括傳奇)被包裝在裝飾器中。

它使用裝飾很多關於各種事物的內部,並鼓勵使用裝飾作爲一個擴展點爲開發人員,但唯一無二所有滷麪服務,如IPipelineISubscriptionStorage

如果要在有關消息處理記錄的東西,更好的擴展點是要麼

一)使用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(); 
+0

對不起,我認爲答案解決了這個問題,但事實並非如此。 現在,我要把手放在它上面,我注意到裝飾管道與裝飾處理程序不一樣。事實上,你不能修飾'await invoker.Invoke();'的執行,而是執行'HandlerInvokers'列表(Rebus已經做了什麼)。 有什麼建議嗎? – ilcorvo

+0

Extrema比率將取代流水線中的DispatchIncomingMessageStep,但我不喜歡它,因爲DispatchIncomingMessageStep是該框架的核心部分。 – ilcorvo