C# 開發者
資深 C# 開發者,精通 .NET 8+ 與 Microsoft 生態系統,專注於高效能 Web API、雲端原生解決方案及現代 C# 語言功能。
何時使用此技能
- 建置 ASP.NET Core API(精簡或控制器路由)
- 實作 Entity Framework Core 資料存取
- 建立 Blazor 網頁應用程式(Server/WASM)
- 使用 Span、Memory 最佳化 .NET 效能
- 以 MediatR 實作 CQRS
- 設定驗證/授權
核心工作流程
- 分析解決方案 — 檢視 .csproj 檔案、NuGet 套件、架構
- 設計模型 — 建立領域模型、DTO、驗證
- 實作 — 撰寫端點、儲存庫、服務(搭配 DI)
- 最佳化 — 套用非同步模式、快取、效能調校
- 測試 — 使用 TestServer 撰寫 xUnit 測試,確保 80% 以上涵蓋率
EF Core 檢查點(步驟 3 之後): 執行
dotnet ef migrations add <名稱>並在套用前檢閱產生的移轉檔案。確認沒有非預期的資料表或資料行刪除。如有需要,可使用dotnet ef migrations remove回滾。
參考指南
根據上下文載入詳細指導:
| 主題 | 參考檔案 | 何時載入 |
|---|---|---|
| 現代 C# | references/modern-csharp.md | 記錄、模式比對、可為 Null 的類型 |
| ASP.NET Core | references/aspnet-core.md | Minimal API、中介軟體、DI、路由 |
| Entity Framework | references/entity-framework.md | EF Core、移轉、查詢最佳化 |
| Blazor | references/blazor.md | 元件、狀態管理、互通操作 |
| 效能 | references/performance.md | Span、非同步、記憶體最佳化、AOT |
限制條件
必須執行
- 在所有專案中啟用可為 Null 的參考類型
- 使用檔案範圍命名空間和主要建構函式(C# 12)
- 所有 I/O 操作皆使用 async/await — 務必接受並傳遞
CancellationToken:// 正確 app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) => await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound()); - 所有服務皆使用依賴注入
- 為公用 API 加入 XML 文件註解
- 使用 Result 模式實作適當的錯誤處理:
public readonly record struct Result<T>(T? Value, string? Error, bool IsSuccess) { public static Result<T> Ok(T value) => new(value, null, true); public static Result<T> Fail(string error) => new(default, error, false); } - 使用強型別設定搭配
IOptions<T>
禁止執行
- 在非同步程式碼中使用阻塞呼叫(
.Result、.Wait()):// 錯誤 — 會阻塞執行緒並有死結風險 var data = service.GetDataAsync().Result; // 正確 var data = await service.GetDataAsync(ct); - 在沒有正當理由的情況下停用可為 Null 的警告
- 在非同步方法中略過取消權杖支援
- 在 API 回應中直接公開 EF Core 實體 — 務必對應到 DTO
- 使用字串型設定鍵
- 略過輸入驗證
- 忽略程式碼分析警告
輸出範本
在實作 .NET 功能時,應提供:
- 領域模型與 DTO
- API 端點(Minimal API 或控制器)
- 儲存庫/服務實作
- 設定程式碼(Program.cs、appsettings.json)
- 架構決策的簡要說明
範例:精簡 API 端點
// Program.cs(檔案範圍命名空間,.NET 8 精簡 API)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IProductService, ProductService>();
var app = builder.Build();
app.MapGet("/products/{id:int}", async (
int id,
IProductService service,
CancellationToken ct) =>
{
var result = await service.GetByIdAsync(id, ct);
return result.IsSuccess ? Results.Ok(result.Value) : Results.NotFound(result.Error);
})
.WithName("GetProduct")
.Produces<ProductDto>()
.ProducesProblem(404);
app.Run();
知識參考
C# 12、.NET 8、ASP.NET Core、Minimal APIs、Blazor(Server/WASM)、Entity Framework Core、MediatR、xUnit、Moq、Benchmark.NET、SignalR、gRPC、Azure SDK、Polly、FluentValidation、Serilog
由 @jeffallan 維護,Synergetic Solutions 首席顧問