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

与Rebus一起使用Autofac时,没有可用的MessageContext,autofac,rebus,Autofac,Rebus,我在下面的代码中得到一个InvalidOperationException。我确信我对autofac IoC和Rebus的了解不足导致了这个错误 System.InvalidOperationException未处理 Message=没有可用的消息上下文-MessageContext实例仅在处理消息期间设置,并且仅在工作线程上可用 StackTrace的一部分: at Rebus.MessageContext.GetCurrent() at Rebus.Autofac.AutofacContai

我在下面的代码中得到一个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]
因此,当我在控制台应用程序中使用下面的代码时,我得到了上面的错误

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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var builder=new Autofac.ContainerBuilder();
RegisterType();
var container=builder.Build();
var适配器=新的AutofacContainerAdapter(容器);
var bus=Configure.With(适配器)
.Transport(t=>t.UseAzureServiceBus(“myConnectionstring”、“我的输入队列”、“错误”))
.CreateBus()
.Start();
adapter.getHandlerInstanceFor();//这是出现错误的行
var timer=new System.Timers.timer();
timer.appeased+=委托{bus.SendLocal(新MyMessage{Body=DateTime.Now.ToString()});};
计时器。间隔=1000;
timer.Start();
Console.ReadLine();
}
}
公共类MyMessage
{
公共字符串体{get;set;}
}
公共类MyHandler:IHandleMessages
{
专用只读IBus_总线;
公共MyHandler(IBus总线)
{
_总线=总线;
}
公共无效句柄(MyMessage)
{
控制台写入线(消息);
}
}
为完整起见,已将其添加到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>

您之所以会收到错误,是因为您正在调用
GetHandlerInstances
,这意味着Rebus在处理消息时会调用它

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


PS:
MyHandler
必须作为
IHandleMessages
的实现在容器中注册-我不是Autofac方面的专家,但我认为您在代码中没有这样做…?

我删除了行,并将生成器更改为:builder.RegisterType().AsImplementedInterfaces();现在它起作用了。谢谢值得注意的是,Autofac可以扫描程序集以查找处理程序。这将注册所有接口:
b.RegisterAssemblyTypes(MyAssembly).AsImplementedInterfaces()
。文档中有更多内容。刚刚上传了一个使用Autofac模块注册REBS处理程序的示例。