1

我正在尝试使用(外部)超时服务的 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:无法使用可用服务和参数调用在类型“Rebus.Bus.TimeoutReplyHandler”上具有“公共绑定标志”的构造函数:无法解析构造函数的参数“Rebus.Bus.IHandleDeferredMessage handleDeferredMessage” '无效.ctor(Rebus.Bus.IHandleDeferredMessage)'。在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IC omponentContext 上下文,IEnumerable 1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 参数)在 Autofac.Core.Resolving.InstanceLookup.Execute()
在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration 注册, IEnumerable`1 个参数)

TimeoutReply 由内部类 TimeoutReplyHandler 处理,它需要 ctor 中的 IHandleDeferredMessage。内部类 DeferredMessageReDispatcher 实现了 IHandleDeferredMessage 并且需要 ctor 中的 IBus。IHandleDeferredMessage 也是内部作用域的。

我应该如何配置 autofac 容器来处理 TimeoutReply?

4

1 回答 1

1

当需要处理TimeoutReplyHandler传入时,Rebus会更新 - 它不应该在您的容器中:)TimeoutReply

我猜你有一些 Autofac 程序集扫描碰巧来自TimeoutReplyHandler,因此最终注册了 Rebus 的一种内部类型,就好像它是你的处理程序一样。

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

于 2015-02-02T18:05:01.577 回答