網站首頁 編程語言 正文
前言:
想到要寫這樣一個系列博客,初衷有兩個:一是希望通過一個實踐項目,將.NET 6 WebAPI開發的基礎知識串聯起來,幫助那些想要入門.NET 6服務端開發的朋友們快速上手,對使用.NET 6開發后端服務的技術全貌有一個基本的認識和掌握,順便把自己的技能樹檢查一遍;二是希望為國內的.NET環境有一些小小的幫助,最早我自己是做C#桌面應用出身的,但是隨著互聯網產業的繁盛和微軟早年間的固執,使得國內的.NET開發環境收縮到幾個固定的領域,以致于很多人今天依然認為C#和.NET不適合做大型的企業級應用,這個觀念需要改變了。我無意比較技術和語言之間的好壞,只是更愿意看到國內的技術環境也能呈現出百家爭鳴的狀態。經過微軟這么多年的改變和進步,.NET 6是一個很優秀的框架,這一點自從我最開始接觸.NET Core 2
起一年一年進化到現在,就深切地感受到,那好東西就拿出來和大家分享一下。
1.列說明
在這個系列博客中,我將會使用.NET 6從頭開始一步一步開發一個TodoList
單體應用,在這個過程中盡可能將多的知識點獨立成每篇文章,最后將應用通過Docker
進行打包,并使用Github
的Action
和Azure Container Instance
服務實現CI/CD。
選擇TodoList的原因是這個項目足夠簡單,但是也足夠去覆蓋我希望覆蓋到的知識點,對于讀者來說,有以下一些建議的前置要求:
- 需要會寫C#,不需要.
NET (Core)
相關的開發經驗。 - 需要后端服務的開發經驗,對基本的服務端相關特性有一定的認識。
- 有對
Clean Architecture
的基本理解。
2.系列導航
2.1 使用.NET 6開發TodoList應用文章索引
附:.NET 6 Web API項目代碼上的變化
2.1.1創建項目
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
2.1.2.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();
2.1.3Change 1: Top-level statements
頂級聲明使得我們在編寫Program
類時可以不用再定義該類,省略Main函數定義,直接開始寫方法體。編譯器會在編譯階段為我們自動加上命名空間和相關定義。
2.1.4Change 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>
2.1.5Change 3: No Startup class
到了.NET 6,陪伴我們好幾個版本至今的ConfigureServices and Configure
方法終于消失了,取而代之的是這兩部分的配置都集中在了Program.cs
中。曾經寫過.NET Core WebAPI
的小伙伴不難看出來現在應該寫在哪里。
對于一些大型項目來說,這兩部分我們肯定不能就這樣寫在Program.cs
里面,后面將會想辦法把這兩部分單獨拆開進行配置。
當然,老版本的含有Startup.cs
的項目在.NET 6下打開沒有任何問題。
2.2 關于Pipeline的一些知識點
2.2.1Pipeline Sequence
- ExceptionHandler
- HSTS
- HttpsRedirection
- Static Files
- Routing
- CORS
- Authentication
- Authorization
- Custom Middlewares
- Endpoint Configuration
2.2.2app.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);
2.2.3app.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
,允許應用程序以這種形式響應客戶端的請求,在快速構建微服務應用的過程中十分好用,在這個系列里,因為構建的是一個單體應用,這部分知識點我打算放到第二個系列關于微服務開發實踐中去,看有沒有更合適的場景去展示。
原文鏈接:https://www.cnblogs.com/code4nothing/p/build-todolist-1.html
相關推薦
- 2023-04-06 C++中的memset用法詳解_C 語言
- 2022-11-13 MacOS下C++使用WebRTC注意事項及問題解決_C 語言
- 2023-12-21 Redis HyperLogLog的使用
- 2022-03-24 Unity腳本自動添加頭部注釋的全過程_C#教程
- 2022-09-30 react中使用usestate踩坑及解決_React
- 2022-07-25 Python定時任務框架APScheduler安裝使用詳解_python
- 2022-05-31 C語言可變參數與函數參數的內存對齊詳解_C 語言
- 2022-01-09 Echarts|Stacked Line Chart(折線圖堆疊)Y軸數據不正確問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支