1

我在下面的代码中得到了 InvalidOperationException。我确信我缺乏关于 autofac IoC 和 Rebus 的知识给了我这个错误。

System.InvalidOperationException 未处理

Message=No message context available - MessageContext 实例只会在处理消息的过程中设置,并且仅在工作线程上可用。

StackTrace 的一部分:

at Rebus.MessageContext.GetCurrent()
at Rebus.Autofac.AutofacContainerAdapter.GetHandlerInstancesFor[T]()
at RebusAutofacDemo.Program.Main(String[] args) in c:\RebusAutofacDemo\Program.cs:line 45
[cut]

所以当我在控制台应用程序中使用下面的代码时,我得到了上面的错误。

class Program
{
   static void Main(string[] args)
    {
        var builder = new Autofac.ContainerBuilder();
        builder.RegisterType<MyHandler>();
        var container = builder.Build();
        var adapter = new AutofacContainerAdapter(container);
        var bus = Configure.With(adapter)
            .Transport(t => t.UseAzureServiceBus("myConnectionstring", "my_input_queue", "error"))
            .CreateBus()
            .Start();

        adapter.GetHandlerInstancesFor<MyHandler>();  // THIS IS THE LINE WITH THE ERROR

        var timer = new System.Timers.Timer();
        timer.Elapsed += delegate { bus.SendLocal(new MyMessage{ Body = DateTime.Now.ToString()}); };
        timer.Interval = 1000;
        timer.Start();

        Console.ReadLine();
    }
}

public class MyMessage
{
    public string Body { get; set; }
}

public class MyHandler : IHandleMessages<MyMessage>
{
    private readonly IBus _bus;
    public MyHandler(IBus bus)
    {
        _bus = bus;
    }

    public void Handle(MyMessage message)
    {
        Console.WriteLine(message);
    }
}

为了完整起见,这已添加到 app.config 中:

<configSections>
  <section name="rebus" type="Rebus.Configuration.RebusConfigurationSection, Rebus" />
</configSections>

<rebus inputQueue="my-app.input" errorQueue="my-app.error" workers="1">
  <endpoints>
    <!-- <add messages="SomeAssembly" endpoint="another-app.input"/> -->
  </endpoints>
</rebus>
4

1 回答 1

2

您收到错误是因为您正在调用GetHandlerInstancesRebus 在处理消息时应该调用它。

尝试删除该行,然后您会看到您的消息得到处理。

PS:MyHandler必须在容器中注册作为实现IHandleMessages<MyMessage>- 我不是 Autofac 方面的专家,但我不认为你在你的代码中这样做......?

于 2014-07-21T22:04:42.477 回答