NCF 中遇到 A circular dependency was detected for the service of type 怎麼排查
阿新 • • 發佈:2020-11-03
簡介
當我們遇到這樣的報錯時,我們可能第一反應就是,怎麼會這樣,我應該怎麼才能解決掉這個問題
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的專案
歡迎大家找我交流