发生以下错误:
对于“Rebus.Retry.IErrorHandler”类型的服务,检测到System.InvalidOperationException HResult=0x80131509 Message=A循环依赖项。( Rebus.Retry.IErrorHandler(Rebus.AzureServiceBus.ErrorMessage.ErrorMessageHandler) -> Rebus.Retry.IErrorHandler Rebus.Retry.IErrorHandler StackTrace: at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain.CheckCircularDependency(Type serviceType at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(Type serviceType,CallSiteChain callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType,Type implementationType,CallSiteChain callSiteChain,ParameterInfo[]参数,布尔Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type )(Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type,implementationType,CallSiteChain callSiteChain) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor描述符,类型serviceType,CallSiteChain callSiteChain)在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType,CallSiteChain CallSiteChain (在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(Type serviceType),callSiteChain callSiteChain(在Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor(Type serviceType)在System.Collections.Concurrent.ConcurrentDictionary
2.GetOrAdd(TKey key, Func2 valueFactory) (System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) 在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServiceT at RebusSubscriber.<>c__DisplayClass7_0`1.b__5(IResolutionContext c)在C:_Repos\AzureServiceBus\Subscriber\RebusSubscriber.cs:line 45在Rebus.Injection.Injectionist.ResolutionContext.GetTService
下面为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.发布于 2019-06-01 07:57:34
错误来自于容器--这是由于您的IErrorHandler实现在其构造函数中接受了一个IErrorHandler,而它似乎并不喜欢这个事实。
这种特殊的模式是装饰图案,它帮助透明地扩展现有服务的功能。Rebus鼓励您使用它来扩展它的行为,通过向configurer.Decorate<IErrorHandler>(...)注册它似乎是正确的。
本例中的错误似乎是您正在IoC容器中注册您的IoC。Rebus不使用您的IoC容器来解析它自己的服务,它只用于解析消息处理程序。
您的IErrorHandler不是消息处理程序,它是决定在消息失败次数太多时如何处理它们的抽象。
因此:不要在IoC容器中注册它。
https://stackoverflow.com/questions/56402087
复制相似问题