2015-02-01 1 views
1

Я тестирую Rebus с (внешним) тайм-аутом.Handle TimeoutReply сообщение с Rebus, сконфигурированное с помощью autofac

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' из конструктор 'Void .ctor (Rebus.Bus.IHandleDeferredMessage)'. на Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance (IC omponentContext контексте, IEnumerable параметров) при Autofac.Core.Resolving.InstanceLookup.Execute()
в Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifeti meScope currentOperationScope, регистрация IComponentRegistration, IEnumerable` 1 параметры)

TimeoutReply обрабатывается внутренним классом TimeoutReplyHandler, который нуждается в IHandleDeferredMessage в CTOR. Внутренний класс DeferredMessageReDispatcher реализует IHandleDeferredMessage и нуждается в IBus в ctor. IHandleDeferredMessage также является внутренним.

Как настроить контейнер autofac для обработки TimeoutReply?

ответ

1

TimeoutReplyHandler является вверх обновленным Ребусом при входящем TimeoutReply должны быть обработаны - он не должен быть в контейнере :)

Я предполагаю, что у вас есть Autofac сканирования сборки, что происходит прибыть TimeoutReplyHandler, что приводит к регистрации одного из внутренних типов Rebus, как если бы это был ваш обработчик.

Посмотрите, можете ли вы удалить регистрацию из контейнера, возможно, зарегистрировав только те типы из ваших собственных сборок.

+0

Это было! Теперь он отлично работает, как с внутренним, так и внешним TimeoutService. И с транспортом MSMQ и SQL. –

Смежные вопросы