代码之家  ›  专栏  ›  技术社区  ›  dampee

将Autofac与Rebus一起使用时没有可用的MessageContext

  •  1
  • dampee  · 技术社区  · 10 年前

    我在下面的代码中得到了InvalidOperationException。我确信我对autofac IoC和Rebus缺乏了解,这是我犯的错误。

    System.InvalidOperationException未处理

    Message=没有可用的消息上下文-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]
    

    因此,当我在Console应用程序中使用下面的代码时,我会得到上面的错误。

    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>
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   mookid8000    10 年前

    你收到错误是因为你在打电话 GetHandlerInstances 这意味着在处理消息时由Rebus调用。

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

    PS(秒): MyHandler 必须在容器中注册为 IHandleMessages<MyMessage> -我不是Autofac的专家,但我不认为你在代码中这么做。。。?