練習 - 登錄及取用服務
ASP.NET Core 應用程式通常需要跨多個元件存取相同的服務。 ASP.NET Core 會使用內建的相依性插入容器來管理應用程式所使用的服務。
小組負責人請您建立公司的裸機網站。 網站應該會在主頁面上顯示歡迎訊息。 您決定建立服務來產生歡迎訊息。 接著,您會向服務容器登錄服務,以便將其插入需要它的元件中。
建立 ASP.NET Core 應用程式
您需要 ASP.NET Core 應用程式來扮演小組應用程式的角色。 讓我們在 Visual Studio Code 中使用 C# 開發套件延伸模組建立新的 ASP.NET Core 應用程式。
啟動 Visual Studio Code。
按 Ctrl+Shift+P 以開啟命令選擇區。
搜尋並選取 [.NET:新增專案...]。
搜尋並選取 [ASP.NET Core Empty]。
選取或建立新專案的資料夾。
將新的應用程式命名為「MyWebApp」。
選取 [建立專案] 以建立專案。
當新專案開啟時,展開 [
Solution Explorer] 窗格以檢視專案檔。
執行應用程式
測試應用程式以確定其可執行。
在 Visual Studio Code 中,按 F5 建置並執行應用程式。
- 出現提示時,選取 [C#] 作為偵錯工具。
- 出現提示時,選取 [C#: MyWebApp [預設設定]] 作為要使用的啟動設定。
此命令會啟動應用程式,並將其裝載在本機網頁伺服器上。 瀏覽器視窗隨即開啟並顯示「Hello, World!」
在 Visual Studio Code 中按 Shift+F5 以關閉瀏覽器視窗並停止應用程式。
建立服務
既然您已有運作中的應用程式,讓我們建立一個服務,為主頁面產生歡迎訊息。
在 Explorer 窗格中,以滑鼠右鍵點擊 MyWebApp 專案。 選取 [新增資料夾]。 將資料夾命名為 Services。
以滑鼠右鍵按一下 [服務] 資料夾。 選取 [新增檔案]。 將檔案命名 WelcomeService.cs。
使用下列程式代碼取代 WelcomeService.cs 的內容:
namespace MyWebApp.Services; public class WelcomeService : IWelcomeService { DateTime _serviceCreated; Guid _serviceId; public WelcomeService() { _serviceCreated = DateTime.Now; _serviceId = Guid.NewGuid(); } public string GetWelcomeMessage() { return $"Welcome to Contoso! The current time is {_serviceCreated}. This service instance has an ID of {_serviceId}"; } }此程式碼會使用產生歡迎訊息的
GetWelcomeMessage方法,定義WelcomeService類別。 該訊息包含服務建立時的目前時間,以及服務的每個執行個體的唯一識別碼。請注意,建構函式中會設定
_serviceCreated和_serviceId欄位,而且其在服務執行個體的存留期一律不會變更。
註冊服務
既然您有服務,您必須向服務容器登錄它。
開啟 Program.cs 檔案。
將下列指示詞新增至檔案的頂端:
using MyWebApp.Services;這個指示詞會解析
WelcomeService類別的參考。緊接在
var builder = WebApplication.CreateBuilder(args);行之後,新增下列程式碼:builder.Services.AddSingleton<WelcomeService>();WebApplication.CreateBuilder會建立WebApplicationBuilder類別的新執行個體,稱為builder。 上述程式碼會向具有單一存留期的服務容器登錄WelcomeService類別。將
app.MapGet("/", () => "Hello World!");行變更為下列程式碼:app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());此程式碼會將 HTTP GET 要求對應至根 URL (
/) 至委派,以傳回WelcomeService服務所產生的歡迎訊息。您的 Program.cs 檔案看起來應該像這樣:
using MyWebApp.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<WelcomeService>(); var app = builder.Build(); app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); app.Run();
測試變更
- 儲存所有變更,並和之前一樣地執行應用程式。
- 當瀏覽器視窗開啟時,請注意根 URL 會顯示
WelcomeService服務所產生的歡迎訊息。 - 在 Visual Studio Code 中按 Shift+F5 以關閉瀏覽器視窗並停止應用程式。
使用介面
您的小組會檢閱您的程式碼,而另一位開發人員會建議您使用介面來登錄服務,因為這種方法可讓程式碼更有彈性且更容易維護。
在 Explorer 窗格中,以滑鼠右鍵點擊 MyWebApp 專案。 選取 [新增資料夾]。 將該資料夾命名為 [介面]。
以滑鼠右鍵按一下 [介面] 資料夾。 選取 [新增檔案]。 將檔案命名 IWelcomeService.cs。
使用下列程式代碼取代 IWelcomeService.cs 的內容:
namespace MyWebApp.Interfaces public interface IWelcomeService { string GetWelcomeMessage(); }此程式碼會使用
GetWelcomeMessage方法定義IWelcomeService介面。 任何實作此介面的服務都必須提供GetWelcomeMessage方法的實作。開啟 Services/WelcomeService.cs 檔案。
將下列指示詞新增至檔案的頂端:
using MyWebApp.Interfaces;這個指示詞會解析您在下一個步驟中新增之
IWelcomeService介面的參考。更新
WelcomeService類別宣告以實作IWelcomeService介面:public class WelcomeService : IWelcomeService這是您唯一需要對
WelcomeService類別進行的變更,以實作IWelcomeService介面。WelcomeService類別已經有GetWelcomeMessage方法,其符合IWelcomeService介面中的方法簽章。開啟 Program.cs 檔案。
將
builder.Services.AddSingleton<WelcomeService>();行更新為下列程式碼:builder.Services.AddSingleton<IWelcomeService, WelcomeService>();此程式碼會使用
IWelcomeService介面向服務容器登錄WelcomeService類別。提示
將此想成說出「當元件要求
IWelcomeService時,請提供WelcomeService的執行個體。」將
app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());行更新為下列程式碼:app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());匿名函式現在預期
IWelcomeService,而不是WelcomeService。您的 Program.cs 檔案看起來應該像這樣:
using MyWebApp.Interfaces; using MyWebApp.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<IWelcomeService, WelcomeService>(); var app = builder.Build(); app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); app.Run();
測試變更
讓我們測試應用程式,以確定它仍如預期般運作。
- 儲存所有變更,並和之前一樣地執行應用程式。
- 當瀏覽器視窗開啟時,請注意根 URL 會顯示
WelcomeService服務所產生的歡迎訊息。 - 讓應用程式保持執行以便進行下一個練習。
![已選取 [ASP.NET Core Empty] 之命令選擇區的螢幕擷取畫面。](../../aspnetcore/configure-dependency-injection/media/aspnet-core-empty.png)
![Visual Studio Code 中 [方案總管] 窗格的螢幕快照。](../../aspnetcore/configure-dependency-injection/media/solution-explorer.png)