Ошибка регистрации IErrorHandler с Rebus - PullRequest
0 голосов
/ 01 июня 2019

Произошла ошибка ниже:

System.InvalidOperationException HResult = 0x80131509 Сообщение = Обнаружена циклическая зависимость для службы типа 'Rebus.Retry.IErrorHandler'.Rebus.Retry.IErrorHandler (Rebus.AzureServiceBus.ErrorMessage.ErrorMessageHandler) -> Rebus.Retry.IErrorHandler Source = Microsoft..DependencyInjection.DependencyInjection.icrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (тип ServiceType, CallSiteChain callSiteChain) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite (тип ServiceType, CallSiteChain callSiteChain) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor (Введите serviceType) в System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (Тип serviceType, ServiceProviderEngineScope serviceProviderEngineerServiceSiderSignSignSignSenceSpenSignSignSignSignSenceSpenSignSignSignStationSpenSignSignSenseSpenSignSignStationSpenSignSignStationSpenSignSignStationSpenSignStationSpenSignSenseSpenSense).T] (поставщик IServiceProvider) в RebusSubscriber. <> C__DisplayClass7_0`1.b__5 (IResolutionContext c) в C: _Repos \ AzureServiceBus \ Subscriber \ RebusSubscriber.cs: строка 45 в Rebus.Injection.Injectionist.ResolutionTService 100G.t 100*

Ниже регистрируется зависимость для IErrorHandler

services.AddTransient<IErrorHandler, ErrorMessageHandler>();

Ниже описано, как это разрешается ErrorMessageHandler и произошла ошибка выше.

Configure.With(Activator)
                .Options(o =>
                {                   
                    o.Decorate<IErrorHandler>(c => 
new ErrorMessageHandler(c.Get<IErrorHandler>()));
                    }



public class ErrorMessageHandler : IErrorHandler
    {
        private readonly IErrorHandler _errorHandler;

        public ErrorMessageHandler(IErrorHandler errorHandler)
        {
            _errorHandler = errorHandler;
        } 

        public async Task HandlePoisonMessage(TransportMessage transportMessage, ITransactionContext transactionContext, Exception exception)
        {
            // keep original behaviour
            await _errorHandler.HandlePoisonMessage(transportMessage, transactionContext, exception);
        }
    }

Кажется, неиспользование IResolutionContext вызывает ошибку.

Есть ли решение?

Обновление

Проблема в том, что IResolutionContext требуется для регистрации своей собственной реализации вместо собственного IoC.Кажется, имя IErrorHandler используется слишком много.

Мое требование, учитывая два отдельных компонента (оболочка Rebus и его клиент), что мы должны позволить клиенту оболочки rebus определять и использовать собственный обработчик ошибок, ErrorMessageHandler в данном случае.

Например, псевдокод обертки Rebus ниже:

Configure.With(Activator)
                    .Options(o =>
                    {                   

//logic to implement below that allow different message handler somehow
//ErrorMessageHandler is this case.
                        o.Decorate<IErrorHandler>(c => 
           xxxxxxx(c.Get<IErrorHandler>()));
                        }

Псевдокод клиента обертки Rebus:

 //pass ErrorMessageHandler to the Rebus wrapper above.

1 Ответ

0 голосов
/ 01 июня 2019

Ошибка происходит из контейнера Microsoft Dependency Injection - это вызвано тем фактом, что ваша реализация IErrorHandler принимает IErrorHandler в своем конструкторе, что ей не нравится.

Этот конкретныйЭто шаблон Декоратор , который помогает прозрачно расширять возможности существующих сервисов.Ребус рекомендует вам использовать его для расширения его поведения, которое, по-видимому, вы делаете правильно, зарегистрировав его с помощью configurer.Decorate<IErrorHandler>(...).

Ошибка в этом случае заключается в том, что вы регистрируете свой ErrorMessageHandler вваш контейнер IoC.Rebus не использует ваш контейнер IoC для разрешения своих собственных служб, он используется ТОЛЬКО для разрешения обработчиков сообщений.

Ваш IErrorHandler не является обработчиком сообщений, это абстракция, которая решает, как Rebus обрабатывает сообщения, как только онислишком много раз.

Поэтому: не регистрируйте его в своем контейнере IoC.

...