開發環境
- IDE:Visual Studio Community 2019 v16.5.2
- ASP.NET Core:ASP.NET Core 3.1.1
註1:ASP.NET Core 3必須要在Visual Studio 2019 以上的任何一個的版本上執行。
註2:安裝Visual Studio時,記得要將工作負載(WorkLoad)頁籤底下的ASP.NET 與網頁程式開發(ASP.NET and web development)打勾。
現在來進入主題吧~首先打開Visual Studio建立我們的第一個ASP.NET Core應用程式吧!
建立專案
- 開啟 Visual Studio,並選擇ASP.NET Core Web 應用程式,之後按下一步。
2. 填寫專案名稱,並選擇想存放的路徑,接著按建立。在這裡,我們將專案名稱取名為「Globomantics」,之後將以此專案作介紹。
3. 確認選擇的Framewok是.NET Core,且版本為 3.1。接著,這篇文章將從頭開始講起,所以我們選擇「空白」的模板,接下來一一介紹。
註:至 .NET Core 3 以後,將不再執行於 .NET Framework 環境底下,而是執行在 .NET Core 喔!
4. 按下建立後,成功建立專案!
相信建立專案大家應該都不成問題,但專案建立後有一些初始自動建好的檔案,大家可能會不懂這些檔案各自扮演什麼樣的角色,底下一一為大家做介紹!
專案檔案介紹
Project configuration file: Globomantics.csproj
在方案總管,對專案按滑鼠右鍵 > Edit Project File 或直接滑鼠左鍵雙擊來開啟Globomantics.csproj。
- Line 4:
<TargetFramework>
是我們剛剛建立專案時選的 Framework ,若要更換其他 Framework ,可以直接手動從這裡更改,不需要再額外卸載原來本的版本。或是我們可以在專案按右鍵 > 屬性,更改此專案的 Target Framework。
- 如果有寫過ASP.NET Core 2以前的版本,會發現csproj是會包含NuGet所安裝的packages的references的,但ASP.NET Core 3以後的版本將不再這麼做了,而是將所需的類型將移至.NET Core本身的類庫,每次更改.NET Core版本時都會自動更新。
Program.cs
- Line 3:Main method在這裡,也就是程式的進入點。當應用程式運行時,會找到Main方法並執行它。和其他程式語言一樣,一開始是使用命令提示字元應用程式來開啟。
- Line 5:透過呼叫CreateHostBuilder 方法回傳 IHostBuilder 來配置Configuration,之後 Build 並 Run .NET Core App ,這時候應用程式轉為ASP.NET Core 應用程式。
- Line 8:CreateHostBuilder 呼叫 Static Host Class 的CreateDefaultBuilder,然後呼叫ConfigureWebHostDefaults使用默認值配置Web Host 建立 Web 的預設組態環境,包含 ASP.NET Core 如何去處理 Web Server、Config檔、Routing等,或是你可以再自己加其他預設設定。舉例來說,ASP.NET Core 預設會去載入 appsetting.json 設定。如果你要更改或加入其他參考,可以用webBuilder呼叫ConfigureAppConfiguration方法來加入其他參考。
- Line 12:Web Host Builder 同時也載入 Startup Class。
Startup.cs
- 可以看到 Startup 是一個沒有任何繼承的普通 Class。
- 在 Startup 中,有兩個 method。首先會呼叫 ConfigureServices,然後再來是 Configure。我們將在下文介紹這兩個method。
ConfigureServices
ConfigureServices 主要負責相依性注入(Dependency Injection,DI)。
在 ASP.NET Core 中,DI 是 ASP.NET 本身不可或缺的一部分。DI 機制取決於Inversion of Control (IOC) 容器(IoC的介紹可看這篇文,講解的淺顯易懂)。基本上,當 application 啟動時,Service(Class)會向容器註冊。一旦註冊了,其他 types 可以向容器詢問該服務的實例(instance)。物件的 Lifetime 會由 Container 來管理。所以,在註冊的時候,你可以決定該實例的 Lifetime。Service Lifetime 分為下列三種:
- Transient lifetime:每次從服務容器中請求時,都會創建一個新的實例。
- Scoped lifetime:每個客戶端請求(連接)時,都會創建一次。實例會生存到整個 web request 結束。
- Singleton lifetime:創建實例後,每個後續請求都使用相同的實例,直到應用程式關閉。
在了解DI後,回到我們的專案。在應用程序啟動時,ASP.NET的hosting層將使可以使用Startup Class中的ConfigureServices方法來在容器中註冊服務。通過提供IServiceCollection對像作為ConfigureServices的參數,可以獲取API進行註冊。
因為我們建立專案時選擇空白的模板,所以它這邊不會幫我們預設註冊service。這篇文章將使用 ASP.NET Core 3 MVC 來建立專案,所以這邊我們程式加入這行services.AddControllersWithViews()
。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
若你的專案是普通的 API 專案,你可以只註冊你要的Controller:services.AddControllers()
;如果是Razor頁面,則可以單獨加入services.AddRazorPages()
這行來擴充。
除了以上這些,你也可以註冊你自己的 Service 至 DI Container。以下舉一個簡單的範例。首先我們需要一個 Service ,所以先在專案底下建立一個「Services」的資料夾,並在此資料夾建立一個Interface「IConferenceService」。
並再建立一個Class「ConferenceMemoryService」實作IConferenceService介面,這個Class用來從Memory取得Conference。另外再實作一個Class「ConferenceApiService」一樣實作IConferenceService介面,這個Class用來從API取得Conference資料。
接下來回到 Startup.cs 的 ConfigureServices method,加入 services.AddSingleton<IConferenceService, ConferenceMemoryService>();
意思為只要某種類型要求提供IConferenceService,就會提供ConferenceMemoryService的實例。而AddSingleton method如同上文提到的生命週期,一旦創建實例了,之後的每個請求都會使用相同的實例,直到應用程序結束。
接著我們在專案底下建立一個「Controllers」資料夾,並新增一個「ConferenceController」繼承「Controller」底層,並在建構子傳入IConferenceService參數。conferenceService 會自動由 Container 注入ConferenceMemoryService的實例。
現在,我們回到 Startup.cs ,我們可以輕鬆地將Memory Service換成真正的API Service。只需要更改剛剛那行程式,替換ConferenceMemoryService
成 ConferenceApiService
。如下:
services.AddSingleton<IConferenceService, ConferenceMemoryService>();
透過Interface,降低Controller和Service的耦合性。當你只想要測試某個Controller本身的功能,透過 DI 特別方便實用。
Configure
在 Startup.cs 的另一個方法是 Configure。
你可以看到它接受另一個名為IApplicationBuilder的服務的接口對象。app這個物件被注入到這個 method 裡面。這個 method 設置了 ASP.NET Core 的 HTTP 請求管道。管道指定 application 應如何響應 HTTP request。當 application 收到來自瀏覽器的 request 時,該 request 將通過管道返回。當管道中沒有任何東西時,什麼也不會發生,因此您需要插入所需的東西。組成管道的各個部分稱為 middleware。例如,可以將MVC框架作為 middleware 插入,但是您可能需要首先進行一些身份驗證。在這種情況下,請在MVC之前配置一塊 middleware。甚至提供包含JavaScript和CSS的靜態文件的功能也必須配置為 middleware。在管道中傳輸時,有關請求的數據在其中傳輸,並由中間件讀取和操縱,最終得到 response。
結語
了解APS.NET Core的基本架構,已經跨出很大一步囉!下一個章節會介紹如何在專案上匯入好用的Packages與Libraries。
如果喜歡這篇文章,麻煩底下幫我按個Like👏給我個鼓勵哦,感謝👧。