2014-06-19 37 views
1

处理完消息后,我需要发送新消息。这是一些命令事件模式,我刚刚处理了一个命令,并且需要提交一个事件(到同一个总线)。将活动重新提交给rebus

消息来自处理程序中可用的总线上下文吗?如果不是,你会如何建议我找回正确的巴士?

回答

2

我不知道我明白你想达到什么目的,但听起来你正在实施通常所说的请求/回复?在这种情况下很容易的,因为那么处理程序可以只是这样做:

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使用。

+0

这正是我所需要的。但是,我不明白“退货地址”究竟在做什么。有没有解释一下,或者你能解释一下这到底是什么? – dampee

+1

是:[Return addresses](https://github.com/rebus-org/Rebus/wiki/Return-addresses);) – mookid8000

1

我使用您发布的代码创建了一个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 
+0

您正在使用'BuiltInContainerAdapter'的'SimpleHandlerActivator',它只是[使用Activator。 CreateInstance'](https://github.com/rebus-org/Rebus/blob/master/src/Rebus/SimpleHandlerActivator.cs#L22)来创建处理程序,该处理程序在构造函数中具有依赖项时失败。 – mookid8000

+2

对于真实世界的用法,您通常会使用容器适配器将呼叫转发到您最喜爱的IoC容器的解析器方法,但如果您想继续使用内置容器适配器,则可以像这样注册您的处理器:'适配器.Register(()=> new SomeRequestHandler(adapter.Bus));' – mookid8000

+0

谢谢,修复了它! – SamuelDebruyn