- 全域 using 指令
作用: 避免在每個類別中重複寫入命名空間,簡化程式碼。
解釋:
escale.Models:引用了 escale 這個專案中的 Models 資料夾,裡頭應該包含了一些資料模型類別。
Dapper:一個輕量級的 ORM 工具,用於與資料庫互動。
Microsoft.AspNetCore.:這些命名空間提供了 ASP.NET Core 的核心功能,包括授權、MVC、資料庫存取等等。
System.:C# 的標準命名空間,提供了基礎的類別和功能。
- 建立 WebApplication
作用: 創建一個 ASP.NET Core 應用程式的啟動類。
解釋:
WebApplication.CreateBuilder(args):創建一個 WebApplicationBuilder 實例,用於配置應用程式。
為什麼需要 WebApplication.CreateBuilder()?
WebApplication.CreateBuilder() 是 ASP.NET Core 應用程式啟動時的一個關鍵步驟,它扮演著一個「建築師」的角色,負責:
初始化應用程式: 為應用程式建立一個基礎的框架,包含了處理 HTTP 請求、配置服務、管理生命週期等基本功能。
配置服務: 允許開發人員在這裡註冊各種服務,例如依賴注入 (DI)、資料庫連線、中間件等等。這些服務將在應用程式運行時被使用。
設定配置: 可以從不同的來源(如 appsettings.json、環境變量)讀取配置信息,並將這些配置信息注入到應用程式中。
建立管道: 配置 HTTP 請求處理的管道,定義請求進入應用程式後,會經過哪些中間件進行處理。
- 添加服務
作用: 將各種服務添加到服務容器中,以便在應用程式中使用。
解釋:
AddControllersWithViews():添加 MVC 控制器的支持,用於處理 HTTP 請求。
AddSingleton():將 CssService 註冊為單例服務,即整個應用程式只有一個實例。
AddDbContext():使用 Entity Framework Core 將 dbEntities 上下文註冊為服務,用於與資料庫互動。
其他:添加 JSON 格式化、Razor Pages、授權、Swagger 等服務。
- 配置
作用: 配置應用程式的各種設定,如 JSON 格式、環境變數、資料庫連線、路由、中間件等。
解釋:
JSON 格式化:配置 JSON 的序列化和反序列化行為,包括日期格式、屬性命名等。
環境設定檔:從 appsettings.json 和環境變數中讀取配置信息。
資料庫連線:配置與資料庫的連線字符串。
OpenAPI:配置 Swagger UI,用於生成 API 文檔。
JWT:配置 JWT 認證,用於保護 API。
Session:配置 Session,用於在請求之間保存用戶狀態。
路由:配置應用程式的路由規則,將 URL 對應到特定的控制器和動作。
- 建構應用程式
作用: 將所有配置好的服務和中間件組裝成一個完整的應用程式。
解釋:
builder.Build():創建一個 WebApplication 實例,表示整個應用程式。
- 配置 HTTP 請求管道
作用: 配置應用程式如何處理 HTTP 請求。
解釋:
UseExceptionHandler:配置異常處理。
UseHttpsRedirection:強制使用 HTTPS。
UseStaticFiles:提供靜態文件服務。
UseRouting:啟用路由功能。
UseSession:啟用 Session 功能。
UseAuthorization:啟用授權功能。
UseEndpoints:配置終結點,即處理 HTTP 請求的具體邏輯。
依賴性注入(Dependency Injection)
注入的途徑有以下三種:
建構式注入(Constructor Injection)
方法注入(Method Injection)
屬性注入(Property Injection)
- 建構子注入 (Constructor Injection)
這是最常見且推薦的方式,將依賴物件直接在建構子中注入。
C#
public class MyClass
{
private readonly IMyInterface _myInterface;
public MyClass(IMyInterface myInterface)
{
_myInterface = myInterface;
}
public
void DoSomething()
{
_myInterface.SomeMethod();
}
}
請謹慎使用程式碼。
優點:
強制要求依賴物件,確保物件在初始化時就擁有所需的資源。
提高可讀性,一目了然哪些是物件的依賴。
缺點:
如果依賴太多,建構子參數可能會過長。
2. 屬性注入 (Property Injection)
通過屬性設置來注入依賴物件。
C#
public class MyClass
{
public IMyInterface MyInterface { get; set; }
public void DoSomething()
{
MyInterface.SomeMethod();
}
}
請謹慎使用程式碼。
優點:
比建構子注入更靈活,可以在物件初始化後再注入依賴。
缺點:
容易忘記設置屬性,導致 NullReferenceException。
降低了物件的不可變性。
3. 方法注入 (Method Injection)
通過方法參數來注入依賴物件。
C#
public class MyClass
{
public void DoSomething(IMyInterface myInterface)
{
myInterface.SomeMethod();
}
}
請謹慎使用程式碼。
優點:
更靈活,可以在需要時才注入依賴。
缺點:
容易忘記傳入依賴物件,導致錯誤。
破壞了方法的單一職責原則。