【发布时间】:2017-04-13 06:46:14
【问题描述】:
设置:在 asp.net mvc 项目中使用 SimpleInjector 进行 Rebus。
我需要创建两个接收消息的处理程序,每个处理程序都来自一个特定的队列。按照我在SO answer 上找到的内容,我创建了类似的代码。
在一个类库中,我有一个实现 SimpleInjector IPackage 的类,其代码如下:
public void RegisterServices( Container container ) {
container.Register<IHandleMessages<MyMessage>, MyMessageHandler>( Lifestyle.Scoped );
IContainerAdapter adapter = new SimpleInjectorContainerAdapter( container );
Configure.With( adapter )
.Transport( t => t.UseAzureServiceBus( connectionString, "A_QUEUE_NAME", AzureServiceBusMode.Standard ) )
.Options( oc => {
oc.SetNumberOfWorkers( 1 );
oc.SimpleRetryStrategy( errorQueueAddress: "A_ERROR_QUEUE_NAME", maxDeliveryAttempts: 3 );
} )
.Start();
Configure.With(adapter
.Transport(t => t.UseAzureServiceBus(connectionString, "B_QUEUE_NAME")
.Options( oc => {
oc.SetNumberOfWorkers( 1 );
oc.SimpleRetryStrategy( errorQueueAddress: "B_ERROR_QUEUE_NAME", maxDeliveryAttempts: 3 );
} )
.Start();
}
但是,当调试器到达第二个 Configure.With( ... ) 调用时,i 会以错误提示终止:
类型 IBus 已注册。如果您的意图是解析 IBus 实现的集合,请使用 RegisterCollection 重载。更多信息:https://simpleinjector.org/coll1。如果您打算用此新注册替换现有注册,则可以通过将 Container.Options.AllowOverridingRegistrations 设置为 true 来允许覆盖当前注册。更多信息:https://simpleinjector.org/ovrrd。
堆栈跟踪:
[InvalidOperationException: Type IBus has already been registered. If your intention is to resolve a collection of IBus implementations, use the RegisterCollection overloads. More info: https://simpleinjector.org/coll1. If your intention is to replace the existing registration with this new registration, you can allow overriding the current registration by setting Container.Options.AllowOverridingRegistrations to true. More info: https://simpleinjector.org/ovrrd.]
SimpleInjector.Internals.NonGenericRegistrationEntry.ThrowWhenTypeAlreadyRegistered(InstanceProducer producer) +102
SimpleInjector.Internals.NonGenericRegistrationEntry.Add(InstanceProducer producer) +59
SimpleInjector.Container.AddInstanceProducer(InstanceProducer producer) +105
SimpleInjector.Container.AddRegistrationInternal(Type serviceType, Registration registration) +69
SimpleInjector.Container.AddRegistration(Type serviceType, Registration registration) +131
SimpleInjector.Container.RegisterSingleton(TService instance) +183
Rebus.SimpleInjector.SimpleInjectorContainerAdapter.SetBus(IBus bus) +55
Rebus.Config.RebusConfigurer.Start() +2356
MyModule.RegisterServices(Container container) +497
SimpleInjector.PackageExtensions.RegisterPackages(Container container, IEnumerable`1 assemblies) +50
Myproject.SimpleInjectorInitializer.InitializeContainer(Container container) +35
Myproject.SimpleInjectorInitializer.Initialize() +68
Myproject.Startup.Configuration(IAppBuilder app) +28
编辑
然后我删除了第二个Configure.With( ... ) 代码块,现在当我执行_bus.Send( message ) 时,我在消费者进程中遇到另一个错误,上面写着
处理 ID 为 fef3acca-97f4-4495-b09d-96e6c9f66c4d 的消息时未处理的异常 1:SimpleInjector.ActivationException:找不到类型 IEnumerable
> 的注册。但是,有 IHandleMessages 的注册;您是要调用 GetInstance >() 还是依赖 IHandleMessages ?还是您的意思是使用 RegisterCollection 注册类型的集合?
堆栈跟踪:
2017-04-13 10:21:03,805 [77] WARN Rebus.Retry.ErrorTracking.InMemErrorTracker -
at SimpleInjector.Container.ThrowMissingInstanceProducerException(Type serviceType)
at SimpleInjector.Container.GetInstanceForRootType[TService]()
at SimpleInjector.Container.GetInstance[TService]()
at SimpleInjector.Container.GetAllInstances[TService]()
at Rebus.SimpleInjector.SimpleInjectorContainerAdapter.<GetHandlers>d__3`1.MoveNext()
【问题讨论】:
标签: asp.net-mvc simple-injector azure-servicebus-queues rebus