2024-10-14 004_學寫API_解釋Program_cs文件中的代碼

2024-10-14 004_學寫API_解釋Program_cs文件中的代碼

當然,讓我逐行為您解釋這個 Program.cs 文件中的代碼。

NLog 初始化與設置

1
2
3
4
5
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NLog;
using NLog.Web;
  • using 關鍵字引用了相關的命名空間,這些命名空間中包含了程序所需的各種類型。
    • Microsoft.AspNetCore.Builder:包含應用程序的管道設置,例如中間件。
    • Microsoft.Extensions.DependencyInjection:提供依賴注入相關的功能。
    • Microsoft.Extensions.Hosting:用於管理應用程序的生命周期和環境配置。
    • NLogNLog.Web:用於 NLog 日誌系統的配置。
1
2
var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");
  • 初始化 NLog 日誌系統,並加載應用程序的設置 (LoadConfigurationFromAppSettings()),這些設置可以來自 NLog.config 文件或 appsettings.json 中。
  • GetCurrentClassLogger() 返回一個用於記錄的 logger 實例。
  • logger.Debug("init main"):寫入一條日誌記錄,記錄級別是 Debug,表示這是一條調試信息。

嘗試構建 Web 應用程序

1
2
3
try
{
var builder = WebApplication.CreateBuilder(args);
  • 使用 WebApplication.CreateBuilder(args) 創建 Web 應用程序的構建器,傳遞命令行參數 args

添加 NLog 到服務中

1
2
3
// 添加 NLog 到服務中
builder.Logging.ClearProviders();
builder.Host.UseNLog();
  • builder.Logging.ClearProviders():清除默認的日誌記錄提供程序,確保我們只使用 NLog 來處理日誌。
  • builder.Host.UseNLog():告訴應用程序使用 NLog 來進行日誌記錄。

添加服務到容器中

1
2
3
4
// 添加服務到容器中
builder.Services.AddControllers(); // 添加控制器服務
builder.Services.AddEndpointsApiExplorer(); // 添加終端 API 瀏覽器服務
builder.Services.AddSwaggerGen(); // 添加 Swagger 生成器服務
  • builder.Services.AddControllers():將控制器添加到應用程序的服務容器中,這樣才能夠處理 HTTP 請求。
  • builder.Services.AddEndpointsApiExplorer():這個方法添加了一個終端點 API 瀏覽器,通常用於查看 API 的端點。
  • builder.Services.AddSwaggerGen():添加 Swagger 生成器服務,這將為應用程序生成 API 文檔。

構建應用程序

1
var app = builder.Build();
  • 使用構建器構建應用程序 app

配置 HTTP 請求管道

1
2
3
4
5
6
// 配置 HTTP 請求管道
if (app.Environment.IsDevelopment()) // 如果是開發環境
{
app.UseSwagger(); // 使用 Swagger 中間件來生成文檔
app.UseSwaggerUI(); // 使用 Swagger UI 中間件來提供可視化界面
}
  • 配置應用程序的請求處理管道。
  • if (app.Environment.IsDevelopment()):檢查當前應用是否處於開發環境中。
    • 如果是開發環境,則啟用 SwaggerSwaggerUI,用於生成並展示 API 文檔。
1
2
app.UseHttpsRedirection();                       // 使用 HTTPS 重定向
app.UseAuthorization(); // 使用授權
  • app.UseHttpsRedirection():自動將 HTTP 請求重定向為 HTTPS,強制使用加密通信。
  • app.UseAuthorization():設置應用程序的授權中間件來處理身份驗證和授權。
1
app.MapControllers();                            // 映射控制器
  • app.MapControllers():將控制器映射到路由中,這樣應用程序可以找到控制器並處理對應的請求。
1
app.Run();                                       // 運行應用程序
  • app.Run():啟動應用程序,等待並處理進入的 HTTP 請求。

捕獲異常

1
2
3
4
5
6
7
8
9
10
}
catch (Exception ex)
{
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
LogManager.Shutdown();
}
  • try...catch 檢測程序執行時的異常。
  • catch 中,如果發生異常,就用 logger.Error(ex, "Stopped program because of exception") 記錄錯誤日誌。
  • finally 中的 LogManager.Shutdown() 保證在應用程序停止時關閉所有的日誌記錄資源,進行清理。

這樣,整個程序設置好了日誌、添加了 Web API 所需的服務,並且在運行過程中會記錄各種信息(例如在發生異常時)。這些功能有助於應用的調試和追踪。