使用.NET 6開發TodoList應用(1)——系列背景


前言

想到要寫這樣一個系列博客,初衷有兩個:一是希望通過一個實踐項目,將.NET 6 WebAPI開發的基礎知識串聯起來,幫助那些想要入門.NET 6服務端開發的朋友們快速上手,對使用.NET 6開發后端服務的技術全貌有一個基本的認識和掌握,順便把自己的技能樹檢查一遍;二是希望為國內的.NET環境有一些小小的幫助,最早我自己是做C#桌面應用出身的,但是隨着互聯網產業的繁盛和微軟早年間的固執,使得國內的.NET開發環境收縮到幾個固定的領域,以致於很多人今天依然認為C#和.NET不適合做大型的企業級應用,這個觀念需要改變了。我無意比較技術和語言之間的好壞,只是更願意看到國內的技術環境也能呈現出百家爭鳴的狀態。經過微軟這么多年的改變和進步,.NET 6是一個很優秀的框架,這一點自從我最開始接觸.NET Core 2起一年一年進化到現在,就深切地感受到,那好東西就拿出來和大家分享一下。

系列說明

在這個系列博客中,我將會使用.NET 6從頭開始一步一步開發一個TodoList單體應用,在這個過程中盡可能將多的知識點獨立成每篇文章,最后將應用通過Docker進行打包,並使用Github的Action和Azure Container Instance服務實現CI/CD。

選擇TodoList的原因是這個項目足夠簡單,但是也足夠去覆蓋我希望覆蓋到的知識點,對於讀者來說,有以下一些建議的前置要求:

  • 需要會寫C#,不需要.NET (Core)相關的開發經驗。
  • 需要后端服務的開發經驗,對基本的服務端相關特性有一定的認識。
  • 有對Clean Architecture的基本理解。

從下一篇文章開始,我們將從需求入手,通過大概30篇左右的文章來實現這個TodoList應用。

系列導航

附:.NET 6 Web API項目代碼上的變化

創建項目

mkdir ProjectName && cd ProjectName
dotnet new sln -n SampleApi
dotnet new project -f net6.0 -n SampleApi -o SampleApi
dotnet sln SampleApi.sln add SampleApi/SampleApi.csproj
dotnet restore
dotnet run -p SampleApi/SampleApi.csproj

.NET 6 WebAPI Program.cs的變更

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Change 1: Top-level statements

頂級聲明使得我們在編寫Program類時可以不用再定義該類,省略Main函數定義,直接開始寫方法體。編譯器會在編譯階段為我們自動加上命名空間和相關定義。

Change 2: Implicit using directives

隱式using指令是編譯器根據項目類型,在編譯階段自動生成一個名為CompanyEmployees.GlobalUsings.g.cs的文件,內容如下:

// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

也可以在CompanyEmployees.csproj工程配置文件中修改以下屬性,禁用全局隱式using指令這一特性:

<!-- <ImplicitUsings>enable</ImplicitUsings> -->
<ImplicitUsings>disable</ImplicitUsings>

Change 3: No Startup class

到了.NET 6,陪伴我們好幾個版本至今的ConfigureServices and Configure方法終於消失了,取而代之的是這兩部分的配置都集中在了Program.cs中。曾經寫過.NET Core WebAPI的小伙伴不難看出來現在應該寫在哪里。

對於一些大型項目來說,這兩部分我們肯定不能就這樣寫在Program.cs里面,后面將會想辦法把這兩部分單獨拆開進行配置。

當然,老版本的含有Startup.cs的項目在.NET 6下打開沒有任何問題。

關於Pipeline的一些知識點

Pipeline Sequence

  1. ExceptionHandler
  2. HSTS
  3. HttpsRedirection
  4. Static Files
  5. Routing
  6. CORS
  7. Authentication
  8. Authorization
  9. Custom Middlewares
  10. Endpoint Configuration

app.Run和app.Use

app.Run用於終止Pipeline的鏈式調用並向客戶端返回

public static void Run(this IApplicationBuilder app, RequestDelegate handler);
public delegate Task RequestDelegate(HttpContext context);

app.Use用於向Pipeline中插入一段邏輯作為鏈式調用的其中一個環節

public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext,
Func<Task>, Task> middleware);

app.Map和app.MapWhen

這兩個方法都是用於在middleware的鏈式調用中進行分支Pipeline調用鏈處理

public static IApplicationBuilder Map(this IApplicationBuilder app, PathString
pathMatch, Action<IApplicationBuilder> configuration)
  
public static IApplicationBuilder MapWhen(this IApplicationBuilder app,
Func<HttpContext, bool> predicate, Action<IApplicationBuilder> configuration)

app.MapGet、app.MapPost、app.MapPut、app.Delete、app.MapMethods

在.NET 6中一個新增的特性叫做Minimal APIs,允許應用程序以這種形式響應客戶端的請求,在快速構建微服務應用的過程中十分好用,在這個系列里,因為構建的是一個單體應用,這部分知識點我打算放到第二個系列關於微服務開發實踐中去,看有沒有更合適的場景去展示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM