C# 如何将REBS与simpleinjector一起使用

C# 如何将REBS与simpleinjector一起使用,c#,simple-injector,rebus,C#,Simple Injector,Rebus,在我的公司中,我们使用SimpleInjector作为我们的IoC框架,现在正在考虑使用REBS作为包装器,通过RabbitMq发送消息。我正在寻找帮助创建一个工作示例。我尝试了以下代码: using Rebus.Activation; using Rebus.Config; using Rebus.Handlers; using Rebus.Pipeline; using Rebus.RabbitMq; using Rebus.SimpleInjector; using SimpleInjec

在我的公司中,我们使用SimpleInjector作为我们的IoC框架,现在正在考虑使用REBS作为包装器,通过RabbitMq发送消息。我正在寻找帮助创建一个工作示例。我尝试了以下代码:

using Rebus.Activation;
using Rebus.Config;
using Rebus.Handlers;
using Rebus.Pipeline;
using Rebus.RabbitMq;
using Rebus.SimpleInjector;
using SimpleInjector;
using System;
using System.Threading.Tasks;

namespace SearchType.ProjectionA
{
class Program
{
    static void Main(string[] args)
    {
        var container = new Container();
        container.Register<IContainerAdapter, SimpleInjectorContainerAdapter>();
        container.Register<IHandleMessages<string>, Handler>();

        var adapter = container.GetInstance<IContainerAdapter>();

        var bus = Configure.With(adapter)
            .Logging(l => l.ColoredConsole())
            .Transport(t => t.UseRabbitMq("amqp://localhost", "simpleinjector_consumer"))
            .Start();

        bus.Subscribe<string>().Wait();

        Console.WriteLine("Projection A listening - press ENTER to quit");
        Console.ReadLine();

    }
}

public class Handler : IHandleMessages<string>
{
    public Task Handle(string message)
    {
        return Task.Run(() =>
       {
           Console.WriteLine(string.Format("{0} - {1}", MessageContext.Current.Message.Headers["rbs2-corr-id"], message));
       });
    }
}
}
有人知道我能做些什么来解决这个问题吗?我不想自己声明所有依赖项


编辑:感谢史蒂文的回复。我已经根据您的答案更改了代码,现在得到一个不同的错误

System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=The configuration is invalid. Creating the instance for type IMessageContext failed. The registered delegate for type IMessageContext threw an exception. Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
  Source=SimpleInjector
  StackTrace:
       at SimpleInjector.InstanceProducer.VerifyInstanceCreation()
       at SimpleInjector.Container.VerifyInstanceCreation(InstanceProducer[] producersToVerify)
       at SimpleInjector.Container.VerifyThatAllRootObjectsCanBeCreated()
       at SimpleInjector.Container.VerifyInternal(Boolean suppressLifestyleMismatchVerification)
       at SimpleInjector.Container.Verify()
       at SearchType.ProjectionA.Program.Main(String[] args) in C:\HRG\TravTech\Springboard\SearchType\SearchType.ProjectionA\Program.cs:line 27
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
       HResult=-2146233088
       Message=The registered delegate for type IMessageContext threw an exception. Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
       Source=SimpleInjector
       StackTrace:
            at SimpleInjector.InstanceProducer.GetInstance()
            at SimpleInjector.InstanceProducer.VerifyInstanceCreation()
       InnerException: 
            HResult=-2146233079
            Message=Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
            Source=Rebus.SimpleInjector
            StackTrace:
                 at Rebus.SimpleInjector.SimpleInjectorContainerAdapter.<SetBus>b__7()
                 at lambda_method(Closure )
                 at SimpleInjector.InstanceProducer.BuildAndReplaceInstanceCreatorAndCreateFirstInstance()
                 at SimpleInjector.InstanceProducer.GetInstance()
            InnerException: 
System.InvalidOperationException未处理
HResult=-2146233079
消息=配置无效。为IMessageContext类型创建实例失败。IMessageContext类型的注册委托引发了异常。试图从MessageContext.current插入当前消息上下文,但为空!您是否尝试从Rebus消息处理程序外部解析IMessageContext?
Source=SimpleInjector
堆栈跟踪:
在SimpleInjector.InstanceProducer.VerifyInstanceCreation()上
在SimpleInjector.Container.VerifyInstanceCreation(InstanceProducer[]producersToVerify)
在SimpleInjector.Container.VerifyAllRootObjectsScanbecreated()上
在SimpleInjector.Container.VerifyInternal(布尔suppressLifestyleMismatchVerification)
在SimpleInjector.Container.Verify()中
在C:\HRG\TravTech\Springboard\SearchType\SearchType.projectona\Program.cs中的SearchType.projectona.Program.Main(字符串[]args)处:第27行
位于System.AppDomain.\u nExecuteAssembly(RuntimeAssembly程序集,字符串[]args)
位于System.AppDomain.ExecuteAssembly(字符串汇编文件、证据汇编安全性、字符串[]args)
在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上
位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态)
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔保存SyncCTX)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
位于System.Threading.ThreadHelper.ThreadStart()处
内部异常:
HResult=-2146233088
Message=类型IMessageContext的注册委托引发了异常。试图从MessageContext.current插入当前消息上下文,但为空!您是否尝试从Rebus消息处理程序外部解析IMessageContext?
Source=SimpleInjector
堆栈跟踪:
在SimpleInjector.InstanceProducer.GetInstance()上
在SimpleInjector.InstanceProducer.VerifyInstanceCreation()上
内部异常:
HResult=-2146233079
Message=试图从MessageContext.current注入当前消息上下文,但为null!您是否尝试从Rebus消息处理程序外部解析IMessageContext?
Source=Rebus.SimpleInjector
堆栈跟踪:
在Rebus.SimpleInjector.SimpleInjectorContainerAdapter.b_u7()中
lambda_法(闭合)
在SimpleInjector.InstanceProducer.buildandReplaceInstanceCreator和CreateFirstInstance()上
在SimpleInjector.InstanceProducer.GetInstance()上
内部异常:

该错误指示IMessageContext只能在消息处理程序内实例化。有没有办法忽略某些错误?

我认为例外情况很明显;简单注入器可防止在解析后进行注册。说明了这样做的原因

解决方案是手动创建
SimpleInjectorContainerAdapter
,并防止适配器依赖容器的自动布线功能:

var container=newcontainer();
IContainerAdapter=新的SimpleInjectorContainerAdapter(容器);
container.Register();
var bus=Configure.With(适配器)
.Logging(l=>l.ColoredConsole())
.Transport(t=>t.UseRabbitMq(“amqp://localhost“,“simpleinjector_consumer”))
.Start();
container.Verify();
System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=The configuration is invalid. Creating the instance for type IMessageContext failed. The registered delegate for type IMessageContext threw an exception. Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
  Source=SimpleInjector
  StackTrace:
       at SimpleInjector.InstanceProducer.VerifyInstanceCreation()
       at SimpleInjector.Container.VerifyInstanceCreation(InstanceProducer[] producersToVerify)
       at SimpleInjector.Container.VerifyThatAllRootObjectsCanBeCreated()
       at SimpleInjector.Container.VerifyInternal(Boolean suppressLifestyleMismatchVerification)
       at SimpleInjector.Container.Verify()
       at SearchType.ProjectionA.Program.Main(String[] args) in C:\HRG\TravTech\Springboard\SearchType\SearchType.ProjectionA\Program.cs:line 27
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
       HResult=-2146233088
       Message=The registered delegate for type IMessageContext threw an exception. Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
       Source=SimpleInjector
       StackTrace:
            at SimpleInjector.InstanceProducer.GetInstance()
            at SimpleInjector.InstanceProducer.VerifyInstanceCreation()
       InnerException: 
            HResult=-2146233079
            Message=Attempted to inject the current message context from MessageContext.Current, but it was null! Did you attempt to resolve IMessageContext from outside of a Rebus message handler?
            Source=Rebus.SimpleInjector
            StackTrace:
                 at Rebus.SimpleInjector.SimpleInjectorContainerAdapter.<SetBus>b__7()
                 at lambda_method(Closure )
                 at SimpleInjector.InstanceProducer.BuildAndReplaceInstanceCreatorAndCreateFirstInstance()
                 at SimpleInjector.InstanceProducer.GetInstance()
            InnerException: