[鼠年全馬鐵人挑戰]Week03-ASP.NET Core 3.1 初心者入門(1)-架構介紹

Nina Weng
10 min readFeb 29, 2020

--

前言

這是一篇系列文,是我上由Roland Guijt教學的線上課程所寫的筆記,並穿插記錄我另外查的一些相關資料。

本系列文的大綱如下:

  • 探索 ASP.NET Core 3 的結構
  • 安裝 Packages 和 Libraries
  • Razor Pages
  • SignalR 簡介
  • 建立 Web API
  • 跨平台的應用程式
  • 部署 ASP.NET Core 3 Application

開發環境

註1:ASP.NET Core 3必須要在Visual Studio 2019 以上的任何一個的版本上執行。

註2:安裝Visual Studio時,記得要將工作負載(WorkLoad)頁籤底下的ASP.NET 與網頁程式開發(ASP.NET and web development)打勾。

現在來進入主題吧~首先打開Visual Studio建立我們的第一個ASP.NET Core應用程式吧!

建立專案

  1. 開啟 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。只需要更改剛剛那行程式,替換ConferenceMemoryServiceConferenceApiService 。如下:

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👏給我個鼓勵哦,感謝👧。

--

--

Nina Weng

一個技能雜亂點的菜鳥工程師。因為實在太菜,有太多東西要學而不知所措。與其把時間花在猶豫不決不知從何開始,不如先開始,然後再漸漸深入專研某一項技能吧!