練習 - 探索服務存留期
在上一個練習中,您使用單一服務存留期註冊了服務。 在程式碼檢閱中,小組負責人會要求您調查單一、限定範圍和暫時性服務存留期之間的差異。
測試單一服務存留期
應用程式在上一個練習結束後仍應持續執行。 若非如此,請如常執行應用程式。
重新整理瀏覽器視窗,並記下歡迎訊息中顯示的時間。
等候幾秒鐘,然後再次重新整理瀏覽器視窗。 歡迎訊息不會變更。 時間戳記和 GUID 維持不變。
歡迎訊息中顯示的時間和 GUID 不會變更,因為
WelcomeService服務註冊為單一服務。 服務會在應用程式啟動時建立一次,並在應用程式的存留期內重複使用。 每個用戶端的每個要求都會使用相同的服務執行個體。 不會建立其他服務執行個體。在 Visual Studio Code 中按 Shift+F5,以停止應用程式。
測試限定範圍的服務存留期
若要了解限定範圍的服務存留期,您必須變更 WelcomeService 服務的註冊方式。
在 Program.cs 檔案中,將
WelcomeService服務的註冊變更為使用限定範圍的服務存留期:builder.Services.AddScoped<IWelcomeService, WelcomeService>();此程式碼會使用限定範圍的存留期向服務容器註冊
WelcomeService類別。如常執行應用程式。
記下歡迎訊息中顯示的時間和 GUID。 重新整理瀏覽器視窗,並留意每次的時間都會變更,且 GUID 每次都不同。
歡迎訊息中顯示的資料會變更,因為
WelcomeService服務現已註冊為限定範圍的服務。 每個用戶端要求會建立一次服務,且服務會在要求完成後遭到處置。 每個用戶端的每個要求都會使用新的服務執行個體。在 Visual Studio Code 中按 Shift+F5,以停止應用程式。
我們將檢查嘗試對相同的要求使用相同
WelcomeService服務的兩個執行個體時,限定範圍的服務存留期會有何行為。 將app.MapGet()行變更為下列程式碼:app.MapGet("/", async (IWelcomeService welcomeService1, IWelcomeService welcomeService2) => { string message1 = $"Message1: {welcomeService1.GetWelcomeMessage()}"; string message2 = $"Message2: {welcomeService2.GetWelcomeMessage()}"; return $"{message1}\n{message2}"; });在上述程式碼中:
-
app.MapGet()委派現在有兩個IWelcomeService類型的參數。 此委派會產生兩個歡迎訊息,每個服務執行個體各一個。 - 委派會在單一回應中傳回兩則訊息。
-
如常執行應用程式。 請注意,即使兩個歡迎訊息在不同的時間產生,且分別以個別參數的形式傳至委派,但訊息完全相同。
之所以有此行為,是因為
WelcomeService服務註冊為限定範圍的服務。 每個用戶端要求會建立一次服務,且在相同要求期間,會將相同的執行個體提供給有需要的所有元件。welcomeService1和welcomeService2是對WelcomeService服務的相同執行個體的參考。重新整理頁面數次。 請注意,歡迎訊息中的時間戳記和 GUID 每次都會變更,但兩則訊息一律相同。
在 Visual Studio Code 中按 Shift+F5,以停止應用程式。
測試暫時性服務存留期
接下來我們將探討暫時性服務存留期。
將
WelcomeService服務的註冊變更為使用暫時性服務存留期:builder.Services.AddTransient<IWelcomeService, WelcomeService>();此程式碼會使用暫時性存留期向服務容器註冊
WelcomeService類別。如常執行應用程式。 兩個訊息中的時間會維持不變,因為
WelcomeService服務的兩個執行個體是同時建立的。 不過,每個訊息中的 GUID 都不同,因為每個服務執行個體都是唯一的。此行為代表暫時性服務存留期。 每次將服務插入元件中,就會建立新的服務執行個體。 由於插入委派中兩次,因此會建立兩個服務執行個體。
重新整理頁面數次。 每次重新整理頁面時,兩個訊息的時間戳記都會相同,但每個訊息中的 GUID 則不同。
在 Visual Studio Code 中按 Shift+F5,以停止應用程式。