使用配置了 autofac 的 Rebus 处理 TimeoutReply 消息
Handle TimeoutReply message with Rebus configured with autofac
我正在使用(外部)超时服务试用 Rebus。
TimeoutService 正确发回 TimeoutReply。
然后订阅者记录了无法调用 TimeoutReplyHandler 的错误。
我正在使用 Autofac 进行依赖注入,并使用以下配置来注册处理程序:
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.GetInterfaces().Any(i => i.IsAssignableFrom(typeof(IHandleMessages))))
.AsImplementedInterfaces()
.InstancePerDependency()
.PropertiesAutowired();
var container = builder.Build();
adapter = new AutofacContainerAdapter(container);
抛出以下异常:
Autofac.Core.DependencyResolutionException: None of the constructors
found with 'Public binding flags' on type
'Rebus.Bus.TimeoutReplyHandler' can be invoked wi th the available
services and parameters: Cannot resolve parameter
'Rebus.Bus.IHandleDeferredMessage handleDeferredMessage ' of
constructor 'Void .ctor(Rebus.Bus.IHandleDeferredMessage)'. at
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IC
omponentContext context, IEnumerable1 parameters) at
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1
parameters) at Autofac.Core.Resolving.InstanceLookup.Execute()
at
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifeti
meScope currentOperationScope, IComponentRegistration registration,
IEnumerable` 1 parameters)
TimeoutReply 由内部 class TimeoutReplyHandler 处理,它需要 ctor 中的 IHandleDeferredMessage。
内部 class DeferredMessageReDispatcher 实现了 IHandleDeferredMessage 并需要 ctor 中的 IBus。
IHandleDeferredMessage 也是内部范围的。
我应该如何配置 autofac 容器来处理 TimeoutReply?
Rebus 在需要处理传入的 TimeoutReply
时更新了 TimeoutReplyHandler
- 它不应该在您的容器中 :)
我猜你有一些 Autofac 程序集扫描恰好来自 TimeoutReplyHandler
,因此最终注册了一个 Rebus 的内部类型,就好像它是你的处理程序一样。
看看您是否可以从容器中删除注册,可能是通过仅注册您自己的程序集中的类型。
我正在使用(外部)超时服务试用 Rebus。
TimeoutService 正确发回 TimeoutReply。 然后订阅者记录了无法调用 TimeoutReplyHandler 的错误。
我正在使用 Autofac 进行依赖注入,并使用以下配置来注册处理程序:
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.GetInterfaces().Any(i => i.IsAssignableFrom(typeof(IHandleMessages))))
.AsImplementedInterfaces()
.InstancePerDependency()
.PropertiesAutowired();
var container = builder.Build();
adapter = new AutofacContainerAdapter(container);
抛出以下异常:
Autofac.Core.DependencyResolutionException: None of the constructors found with 'Public binding flags' on type 'Rebus.Bus.TimeoutReplyHandler' can be invoked wi th the available services and parameters: Cannot resolve parameter 'Rebus.Bus.IHandleDeferredMessage handleDeferredMessage ' of constructor 'Void .ctor(Rebus.Bus.IHandleDeferredMessage)'. at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IC omponentContext context, IEnumerable
1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1 parameters) at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifeti meScope currentOperationScope, IComponentRegistration registration, IEnumerable` 1 parameters)
TimeoutReply 由内部 class TimeoutReplyHandler 处理,它需要 ctor 中的 IHandleDeferredMessage。 内部 class DeferredMessageReDispatcher 实现了 IHandleDeferredMessage 并需要 ctor 中的 IBus。 IHandleDeferredMessage 也是内部范围的。
我应该如何配置 autofac 容器来处理 TimeoutReply?
Rebus 在需要处理传入的 TimeoutReply
时更新了 TimeoutReplyHandler
- 它不应该在您的容器中 :)
我猜你有一些 Autofac 程序集扫描恰好来自 TimeoutReplyHandler
,因此最终注册了一个 Rebus 的内部类型,就好像它是你的处理程序一样。
看看您是否可以从容器中删除注册,可能是通过仅注册您自己的程序集中的类型。