1. 程式人生 > 實用技巧 >NCF 中遇到 A circular dependency was detected for the service of type 怎麼排查

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的專案

歡迎大家找我交流