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.