使用配置了 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(IEnumerable1 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 的内部类型,就好像它是你的处理程序一样。

看看您是否可以从容器中删除注册,可能是通过仅注册您自己的程序集中的类型。