zoukankan      html  css  js  c++  java
  • NCF 中遇到 A circular dependency was detected for the service of type 怎么排查

    简介

    当我们遇到这样的报错时,我们可能第一反应就是,怎么会这样,我应该怎么才能解决掉这个问题

    System.InvalidOperationException: A circular dependency was detected for the service of type 'ML.Xncf.Admin.Services.SubscribeProductsService'.
    ML.Xncf.Admin.Services.SubscribeProductsService -> ML.Xncf.Admin.Services.CategoryService -> ML.Xncf.Admin.Services.SubscribeProductsService
       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.<>c__DisplayClass7_0.<GetCallSite>b__0(Type type)
       at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(Type serviceType, CallSiteChain callSiteChain)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, Type serviceType, Type implementationType, CallSiteChain callSiteChain)
       at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain, Int32 slot)

    步骤

    1.读懂这个问题

    2.分析问题可能产生的原因

    3.根据提供的报错信息去顺藤摸瓜

    4.尝试修改

    5.重复3,4步骤

    案例

    1.读懂问题

    A circular dependency was detected for the service of type 'ML.Xncf.Admin.Services.SubscribeProductsService'

    译文:检测到类型为的服务的循环依赖项

    2.分析问题

    当我们看到这样的字样的时候,我们肯定知道肯定是循环依赖了,但就是不知道发生在哪里,紧接着我们再看后面
    ML.Xncf.Admin.Services.SubscribeProductsService -> ML.Xncf.Admin.Services.CategoryService -> ML.Xncf.Admin.Services.SubscribeProductsService

    我们发现,提示告诉我们是:
    SubscribeProductsService ,CategoryService,SubscribeProductsService

    这样的循环顺序

    3.顺藤摸瓜

    在文件SubscribeProductsService.cs中,我们找到了这样的引用

            private readonly CategoryService categoryService;
    
            public SubscribeProductsService(IRepositoryBase<SubscribeProducts> repo, IServiceProvider serviceProvider, CategoryService categoryService) : base(repo, serviceProvider)
            {
                this.categoryService = categoryService;
            }

    在文件CategoryService.cs中,我们找到了这样的引用

            private readonly SubscribeProductsService subscribeProductsService;
    
            public CategoryService(IRepositoryBase<Category> repo, IServiceProvider serviceProvider,SubscribeProductsService subscribeProductsService) : base(repo, serviceProvider)
            {
                this.subscribeProductsService = subscribeProductsService;
            }

    问题比较明朗了,问题就是,我引用了你,你又引用了我,那系统没办法知道到底是该谁引用谁,然后就傻傻分不清楚了

    4.尝试修改

    我们将SubscribeProductsService.cs文件中的CategoryService直接删掉,再去尝试看看结果

    就可以看到,我们已经成功的解决了这个问题,由此我们可以知道,类似的问题,我们编写的时候需要注意排查

    养成一个好的习惯,如果仍未解决掉,请重试3,4的顺序来进行调试

    希望大家写出无Bug的项目

    欢迎大家找我交流

  • 相关阅读:
    推荐两款好用的反编译工具(Luyten,Jadx)
    在windows上运行linux
    Spring IOC的理解
    Django 13 admin和auth系统、权限问题
    Django 12 中间件、上下文处理器和admin后台
    Django 11 form表单(状态保持session、form表单及注册实现)
    Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)
    Django 09 博客小案例
    Django 解答 01 (pycharm创建项目)
    Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
  • 原文地址:https://www.cnblogs.com/zhao365845726/p/13917895.html
Copyright © 2011-2022 走看看