[ASP.NET WebAPI] #2 專案程式架構:Controllers、Docs、EmailTemplate、Models、Services資料夾中的程式,分別如何運作。

當我們在Visual Studio 建出 一個ASP.NET Web Application 的時候, 會自動有Controllers 的 資料夾。 其餘其他的是我們自己做的資料夾。 以下會解釋Controllers、Docs、EmailTemplate、Models、Services資料夾中的程式,分別如何運作

1. Controllers 資料夾

名字來源於 Control (控制), Controllers (控制器) 是 Web API 的核心組件,負責處理 HTTP 請求並返回 HTTP 回應。每個控制器地下會有一組相關的 API ,每個API對應一個 HTTP 動詞(如 GET、POST、PUT、DELETE)並處理邏輯, 以及迴圈一個東西。

常用命名
平常關於使用者賬號會做成一個Controllers, 名叫 AccountControllers. 那其系統裡面的功能會在另外Controllers 檔案。

程式碼 controllers-part-1

  1. 使用多個外部套件和命名空間
  2. namespace Stanec.Controllers 用namespace 來組織程式碼
    [Route("Account")]這是一個屬性,意味著當客戶端發送請求到 http://<yourdomain>/Account 時,這個控制器會處理這些請求。
  3. 通過建構函式(Constructor)將不同的服務(Service)和資源注入到 AccountController 中,以便控制器可以使用這些服務來處理帳戶相關的業務邏輯和操作
  4. API 列表

了解更多Service 請參考 5. Services 資料夾

要寫出第一個API 請參考 [ASP.NET WebAPI] #4 寫第一支API

<br/>

2. Docs 資料夾

這個資料夾通常用來存放專案的文件資料,如 API 的使用說明。
目前會按照Controllers 有幾個, 那文件會有幾個。 每一隻API 會有各自的註解, 會有Request, Response 的 註解。

docs-part-1

了解怎麼設定註解請參考 [ASP.NET WebAPI] #5 Swagger UI如何在C#上使用

<br/>

3. EmailTemplate 資料夾

此資料夾通常存放郵件範本(如 HTML 或文本格式的郵件內容)。這些範本可以被程式用來動態生成郵件,例如註冊確認、密碼重設等。關於寄送Email 的程式不在這邊, 會在Service中被解釋。 emailtemplate-part-1 Code 會在寄送Email的時候被代替

<br/>

4. Models 資料夾

Models(模型)資料夾包含了應用程式使用的資料結構,這些結構通常反映了資料庫的結構或傳輸層的資料結構(DTO-Data Transfer Object)。 常用檔案: ClassBaseDB.cs、DBData.cs、ReqData.cs、ResData.cs

A. ClassBaseDB.cs

宣告將從資料庫接收的資料 model-part-1

Public virtual DbSet<User1> User { get; set; } 我们可以从数据库中获取 User1 数据。

<br/>

B. DBData.cs

宣告新的資料格式, Request 與 Response 除外 model-part-2

<br/>

C. ReqData.cs

宣告Request(請求)的資料格式 model-part-3

<br/>

D. ResData.cs

宣告Response(回复)的資料格式 model-part-4

<br/>

5. Services 資料夾

Services 資料夾裡面主要有Interfaces 跟 Services. Services 主要提供一種抽象層,使代碼更加模塊化、可擴展和易於維護。 <br/> 依賴注入(Dependency Injection)是一種把某種功能/服務注入到主要程式裡面, 簡單來說是把一些功能/服務寫在別的檔案裡面。 這樣子有助於讓程式碼更簡潔,易於測試

// ClassBaseDB
private readonly StanecDbContext _dbcontext;
private readonly IWebHostEnvironment _env;
private readonly IEncryption _aesCrypto;
private readonly IGmail _gmail;
private readonly IEmailTemplate _emailTemplate;
private readonly IJwtAuthUtil _jwtAuthUtil;
private readonly IJwtAuthFilter _jwtAuthFilter;

public AccountController(StanecDbContext dbcontext, IWebHostEnvironment env, IEncryption aesCrypto, IGmail gmail, IEmailTemplate emailTemplate, IJwtAuthFilter jwtAuthFilter, IJwtAuthUtil jwtAuthUtil)
{
    _dbcontext = dbcontext;
    _env = env;
    _aesCrypto = aesCrypto;
    _gmail = gmail;
    _emailTemplate = emailTemplate;
    _jwtAuthFilter = jwtAuthFilter;
    _jwtAuthUtil = jwtAuthUtil;
}

services-part-1

這邊的程式是在做Dependency Injection, 把各個服務拿來Controllers 使用。