重新提交事件以rebus

时间:2014-06-19 15:44:55

标签: c# rebus

在收到消息后,我需要发送一条新消息。这是一些命令事件模式,我刚刚处理了一个命令,需要提交一个事件(到同一个总线)。

处理程序中是否有来自消息的总线上下文?如果不是,你会怎么建议我找回正确的公共汽车?

2 个答案:

答案 0 :(得分:3)

我不确定我理解你想要实现的目标,但听起来你正在实施通常被称为请求/回复的东西?在这种情况下,它很容易,因为处理程序可以这样做:

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时,邮件的处理程序将用作目标。

答案 1 :(得分:2)

我使用您发布的代码创建了一个处理程序。但是,当触发此处理程序时,我得到以下异常。所有其他没有参考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