上回介紹了如何使用基本的依賴注入機制,若想要類似ASP.Net Core 那樣有個Hosting 來驅動,
以下測試適用 .NET Core 3.1 SDK 版本或以上
建立Console 應用程式,並且透過Nuget 安裝Microsoft.Extensions.Hosting
以下先準備相關程式
建立Interface IReportServiceLifetime
建立各生命週期 Service Interface 並且繼承自IReportServiceLifetime
IExampleTransientService
IExampleScopedService
IExampleSingletonService
建立各生命週期的 Service Class
建立 ServiceLifetimeReporter Class
其中建構式會注入各生命週期的Service 實體,並且設計ReportServiceLifetimeDetails() 方法來輸出
對應訊息
最後就是 DI 設計,這部分寫在 Program.cs 檔案,上方需 using Microsoft.Extensions.Hosting
上圖中,透過 Host.CreateApplicationBuilder() 方法建立 builder 實體,再透過 builder.Services 註冊
相關類別,後面再刻意呼叫兩次ExemplifyServiceLifetime()方法,其中各別傳入「Lifetime 1」、
「Lifetime 2」來識別呼叫,後續可從執行結果看出各生命週期的物件的 Guid 是否為同一個實體。
其中,ExemplifyServiceLifetime()方法中會建立 Scope 物件,再取得 ServiceProvider(提供者)之後,
使用 GetRequiredService() 方法取得 Reporter 物件,Reporter 會呼叫ReportServiceLifetimeDetails()
方法印出詳細的內容,然後再次透過 Provider.GetRequiredService() 方法 取得 Reporter 物件,
並且印出內容,所以同一個 scope 會有「兩次」印出的動作
執行結果
由以上結果可看出
SingletonService:Lifetime1 或 Lifetime2 中總共4次的Guid 值都是相同的
ScopeService:在相同的Lifetime 中,其Guid 值相同,不同的 Lifetime 中Guid 值不同,符合預期
TransientService:每次的 Guid 值都不同
【參考】
沒有留言:
張貼留言