<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      在 Development 環(huán)境下依賴注入的行為可能有所不同

      奇怪的問題

      本周被一個奇怪的問題困擾了一天。事情的起因是這樣的:在某個 PR 合并后,我拉了最新代碼,但是在我本地F5調試始終報錯。示例代碼如下:

          public interface Interface1
          {
              void Method1();
          }
      
          public class MockSerivce
          {
              public MockSerivce(Interface1 interface1)
              {
      
              }
          }
      
      builder.Services.AddSingleton<MockSerivce>();
      
      

      報的錯誤呢也顯而易見:

      Unable to resolve service for type 'DevelopmentTest.Interface1' while attempting to activate 'DevelopmentTest.MockSerivce'
      

      我們沒有注冊 Interface1 到 DI 容器里,那自然實例化 MockSerivce 的時候就找不到依賴了。
      但是奇怪的是:我其他同事們都沒有這個問題,他們在本地調試的時候都好好的,并不會報錯。并且在這個分支編譯后的代碼在開發(fā)服務器上運行的都很完美。
      這個就有點沖擊到我了,難道是我電腦有問題,VS 有問題,還是我人品有問題?

      尋找答案

      當然了代碼是不會騙人的,造成以上問題一定不是我人品問題而是代碼的問題。
      經過一番嘗試,我發(fā)現(xiàn)這個問題跟系統(tǒng)運行在哪個環(huán)境有關系。只要我把 launchSettings.json 里的 ASPNETCORE_ENVIRONMENTDevelopment 改成別的什么值,那么一切都運行正常了。正巧在我們組其他同事都維護一個自己的 appestings.username.json 然后運行在這個環(huán)境之下,也就是說他們都不運行在 Development 下。這就是為啥只有我會報錯的原因了。
      事情到了這一步,那么我們很容易猜測: .NET DI 系統(tǒng)在 Development 下是有騷操作的。在 Development 下它會進行依賴分析,如果依賴關系有錯誤,那么直接會報錯。但是在其他環(huán)境下就不會提交分析校驗,只有在運行時真正嘗試實例化對象的時候才會報錯。
      當然靠猜測總是不太靠譜,干脆翻翻代碼吧。很快就找到了:

          internal static ServiceProviderOptions CreateDefaultServiceProviderOptions(HostBuilderContext context)
              {
                  bool isDevelopment = context.HostingEnvironment.IsDevelopment();
                  return new ServiceProviderOptions
                  {
                      ValidateScopes = isDevelopment,
                      ValidateOnBuild = isDevelopment,
                  };
              }
      

      HostingHostBuilderExtensions 這個擴展類里很清楚的看到,只有在 Development 下 DefaultServiceProviderOptions 的 ValidateScopesValidateOnBuild 會被設置為 True。這就直接證明了上面的猜想。只有在 Development 下才會在啟動的時候去校驗依賴關系。

      強制校驗

      既然找到了答案,那么讓我們來試一下:強制開啟依賴關系的校驗。

      var builder = WebApplication.CreateBuilder(args);
      
      builder.Host.UseDefaultServiceProvider(op =>
      {
          op.ValidateOnBuild = true;
          op.ValidateScopes = true;
      });
      

      代碼如上在 Host 上調用 UseDefaultServiceProvider 擴展方法,指定 ValidateScopesValidateOnBuild 都為 True
      再次運行我們的項目,這個時候不管是在 Development 還是 Production 還是別的任何環(huán)境下,都會報錯了。

      Unable to resolve service for type 'DevelopmentTest.Interface1' while attempting to activate 'DevelopmentTest.MockSerivce'
      

      總結

      通過以上我們可以發(fā)現(xiàn) .NET 的 DI 系統(tǒng),在 Development 環(huán)境下跟其他環(huán)境的行為是不同的。在 Development 下會提交進行依賴關系的校驗,如果有問題會提前報錯。所以我們調試的時候請盡量選擇在 Development 下進行或者手動強制開啟校驗。這個問題很容易被忽視,至少我沒在其他博文里見有人提到過。其實在微軟的官方文檔上是提到了,但也確實就是提了一嘴而已。
      關于這個話題其實還沒完,還有一個更有意思的問題:Captive dependency 可以聊一下。但是今天太晚了,改天吧。
      參考:https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection#scope-validation

      posted @ 2025-01-05 23:01  Agile.Zhou  閱讀(295)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产精品二区中文字幕| 亚洲天堂成人网在线观看| 久久99国产精一区二区三区! | 三男一女吃奶添下面视频| 一区天堂中文最新版在线| 中文字幕日韩精品有码| 婷婷色香五月综合缴缴情香蕉| 天天爽夜夜爽人人爽曰| 国产人成亚洲第一网站在线播放| ww污污污网站在线看com | 亚洲一区二区三区| 汉阴县| 岛国最新亚洲伦理成人| 囯产精品久久久久久久久久妞妞| 日本一道本高清一区二区| 亚洲综合一区二区三区不卡| 久久青草国产精品一区| 久久综合给合久久狠狠狠88| 合江县| 99中文字幕精品国产| 亚洲av无码一区二区三区网站| 挺进粗大尤物人妻中文字幕| 丰满妇女强制高潮18xxxx | 72种姿势欧美久久久久大黄蕉| 国内极度色诱视频网站| 99久久国产成人免费网站| 亚洲国产一区二区三区| 鲁丝一区鲁丝二区鲁丝三区| 亚洲成a人无码av波多野| 亚洲国产精品无码观看久久| 国产精品一码二码三码四码| 中文字幕日韩精品国产| 高清偷拍一区二区三区| 在线精品国精品国产不卡| 国产亚洲精品自在久久vr| 亚洲日韩国产二区无码| 无码精品人妻一区二区三区中| 强奷漂亮人妻系列老师| 国产精品亚洲一区二区在| 国产在线啪| 乱码精品一区二区亚洲区|