處理完消息後,我需要發送新消息。這是一些命令事件模式,我剛剛處理了一個命令,並且需要提交一個事件(到同一個總線)。將活動重新提交給rebus
消息來自處理程序中可用的總線上下文嗎?如果不是,你會如何建議我找回正確的巴士?
處理完消息後,我需要發送新消息。這是一些命令事件模式,我剛剛處理了一個命令,並且需要提交一個事件(到同一個總線)。將活動重新提交給rebus
消息來自處理程序中可用的總線上下文嗎?如果不是,你會如何建議我找回正確的巴士?
我不知道我明白你想達到什麼目的,但聽起來你正在實施通常所說的請求/回覆?在這種情況下很容易的,因爲那麼處理程序可以只是這樣做:
public class SomeRequestHandler {
readonly IBus bus;
public SomeRequestHandler(IBus bus) {
this.bus = bus;
}
public void Handle(SomeRequest request) {
bus.Reply(new SomeReply(...));
}
}
已發送的郵件會自動配備了rebus-return-address
header該消息的處理程序將作爲目標時,你bus.Reply
使用。
我使用您發佈的代碼創建了一個Handler。但是,當這個處理程序被觸發時,我會得到以下異常。沒有參考IBus的所有其他處理程序按預期工作。
2/07/2014 14:53:10:
System.Reflection.TargetInvocationException: Het doel van een aanroep heeft een uitzondering veroorzaakt. ---> System.MissingMethodException: Er is geen paramet
erloze constructor voor dit object opgegeven.
bij System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, B
oolean& bNeedSecurityCheck)
bij System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
bij System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
bij System.Activator.CreateInstance(Type type, Boolean nonPublic)
bij System.Activator.CreateInstance(Type type)
bij Rebus.SimpleHandlerActivator.<>c__DisplayClass1.<Register>b__0()
bij Rebus.SimpleHandlerActivator.<GetHandlerInstancesFor>b__b[T](Func`1 f)
bij System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
bij System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
bij System.Linq.Buffer`1..ctor(IEnumerable`1 source)
bij System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
bij Rebus.SimpleHandlerActivator.GetHandlerInstancesFor[T]()
bij Rebus.Configuration.BuiltinContainerAdapter.GetHandlerInstancesFor[T]()
--- Einde van intern uitzonderingsstackpad ---
bij System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bij System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bij System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
bij Rebus.Bus.Dispatcher.GetHandlerInstances(Type messageType)
bij System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
bij System.Linq.Buffer`1..ctor(IEnumerable`1 source)
bij System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
bij Rebus.Bus.Dispatcher.Dispatch[TMessage](TMessage message)
bij Rebus.Bus.Worker.DispatchGeneric[T](T message) bij Rebus.Bus.Worker.DoTry()
Rebus.Bus.RebusBus WARN (Rebus 1 worker 1): Message RoodFluweel.Messaging.Models.Commands.SendPrintAtHomeTickets is forwarded to error queue
您正在使用'BuiltInContainerAdapter'的'SimpleHandlerActivator',它只是[使用Activator。 CreateInstance'](https://github.com/rebus-org/Rebus/blob/master/src/Rebus/SimpleHandlerActivator.cs#L22)來創建處理程序,該處理程序在構造函數中具有依賴項時失敗。 – mookid8000
對於真實世界的用法,您通常會使用容器適配器將呼叫轉發到您最喜愛的IoC容器的解析器方法,但如果您想繼續使用內置容器適配器,則可以像這樣註冊您的處理器:'適配器.Register(()=> new SomeRequestHandler(adapter.Bus));' – mookid8000
謝謝,修復了它! – SamuelDebruyn
這正是我所需要的。但是,我不明白「退貨地址」究竟在做什麼。有沒有解釋一下,或者你能解釋一下這到底是什麼? – dampee
是:[Return addresses](https://github.com/rebus-org/Rebus/wiki/Return-addresses);) – mookid8000