首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rebus注册IErrorHandler时出错

使用Rebus注册IErrorHandler时出错
EN

Stack Overflow用户
提问于 2019-05-31 21:53:22
回答 1查看 218关注 0票数 0

发生以下错误:

对于“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.ConcurrentDictionary2.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注册依赖项

代码语言:javascript
复制
services.AddTransient<IErrorHandler, ErrorMessageHandler>();

下面是它如何解析ErrorMessageHandler和上面发生的错误。

代码语言:javascript
复制
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包装器的伪代码:

代码语言:javascript
复制
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包装器的客户端伪代码:

代码语言:javascript
复制
 //pass ErrorMessageHandler to the Rebus wrapper above.
EN

回答 1

Stack Overflow用户

发布于 2019-06-01 07:57:34

错误来自于容器--这是由于您的IErrorHandler实现在其构造函数中接受了一个IErrorHandler,而它似乎并不喜欢这个事实。

这种特殊的模式是装饰图案,它帮助透明地扩展现有服务的功能。Rebus鼓励您使用它来扩展它的行为,通过向configurer.Decorate<IErrorHandler>(...)注册它似乎是正确的。

本例中的错误似乎是您正在IoC容器中注册您的IoC。Rebus不使用您的IoC容器来解析它自己的服务,它只用于解析消息处理程序。

您的IErrorHandler不是消息处理程序,它是决定在消息失败次数太多时如何处理它们的抽象。

因此:不要在IoC容器中注册它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56402087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档