如何更好地組織最小 WEB API 代碼結構

前言

我們在《.NET 6新特性試用》中講過,隨著項目需求和復雜性的增加,單個文件的最小 WEB API 會變得非常臃腫。

而且,Program.cs 應該只放啟動和初始化代碼。不應該包含太多 MapXXX 方法。

那么,如何以更好的方式組織最小 WEB API 代碼結構呢?

1. 靜態幫助類

可以將它們移到單獨的類中。

例如,你可以創建一個名為 MinimalApiHelper 的靜態類并向其添加靜態方法:

public?static?class?MinimalApiHelper
{public?static?void?RegisterWeatherForecastAPIs(WebApplication?app){var?summaries?=?new[]{"Freezing",?"Bracing",?"Chilly",?"Cool",?"Mild",?"Warm",?"Balmy",?"Hot",?"Sweltering",?"Scorching"};app.MapGet("/weatherforecast",?()?=>{......}).WithName("GetWeatherForecast");}
}

Program.cs 修改如下:

......app.UseHttpsRedirection();MinimalApiHelper.RegisterWeatherForecastAPIs(app);app.Run();

2. 擴展方法

更進一步,可以將這些靜態方法創建為 WebApplication 類的擴展方法:

public?static?void?RegisterWeatherForecastAPIs(this?WebApplication?app)
{......
}

可以像這樣簡化調用代碼:

......app.RegisterWeatherForecastAPIs();app.Run();

3. 依賴注入

但是,存在大量服務時,需要多次執行注冊代碼:

app.RegisterService1APIs();
app.RegisterService2APIs();
......

我們可以使用依賴注入簡化注冊代碼。

實現代碼如下:

public??static?class?MinimalApiExtentions
{public?static?void?AddMinimalApiRegisters(this?IServiceCollection?services,?params?Type[]?types){var?registers?=?new?List<IMinimalApiRegister>();foreach?(var?type?in?types){registers.AddRange(type.Assembly.GetTypes().Where(x?=>?typeof(IMinimalApiRegister).IsAssignableFrom(x)?&&?!x.IsInterface?&&?!x.IsAbstract).Select(Activator.CreateInstance).Cast<IMinimalApiRegister>());}services.AddSingleton<IEnumerable<IMinimalApiRegister>>(registers);}public?static?void?UseMinimalApiRegisters(this?WebApplication?app){var?registers?=?app.Services.GetRequiredService<IEnumerable<IMinimalApiRegister>>();foreach?(var?register?in?registers){register.RegisterAPIs(app);}}
}

Program.cs 修改如下:

var?builder?=?WebApplication.CreateBuilder(args);
builder.Services.AddMinimalApiRegisters(typeof(Program));var?app?=?builder.Build();
app.UseMinimalApiRegisters();
app.Run();

遍歷程序集中的所有 IMinimalApiRegister 實現類,然后遍歷調用實現類的 RegisterAPIs 方法。

示例實現類如下:

public?class?Service1Register?:?IMinimalApiRegister
{?public?void?RegisterAPIs(WebApplication?app){app.MapGet("/",?()?=>?"Hello?My?IO");}
}

結論

今天,我們介紹了如何組織最小 WEB API 代碼結構。

如果你有更好的方案,歡迎到我的公眾號“My IO”留言討論

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285742.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題八十四之求空間兩點之間的距離

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 定義一個表…

git分支進階

其實git除了版本控制&#xff0c;另外一個最突出的特點就是他的分支操作。簡直 絲滑~.git也是多人協作的必備武器。 通常我們正常情況下只需要master 和 develop分支就夠了。 這里我們先以這兩條分支作為基準&#xff0c;進行一系列的操作。 開發新功能流程 這個應該屬于develo…

關于c# .net爬蟲

剛開始聽到爬蟲這兩個字眼的時候感覺挺稀奇的&#xff0c;之前并沒有接觸過爬蟲&#xff0c;正好這會手上沒事&#xff0c;于是便百度了一下。 1.網絡爬蟲&#xff08;又被稱為網頁蜘蛛&#xff0c;網絡機器人&#xff0c;在FOAF社區中間&#xff0c;更經常的稱為網頁追逐者&am…

Google 的 Java 編碼規范,參考學習!

目錄 01 術語說明和指南說明 02 源文件基礎 2.1 文件名 2.2 文件編碼&#xff1a;UTF-8 2.3 特殊字符 03 源文件結構 3.1 許可證或版權信息 3.2 package語句 3.3 import語句 3.4 類聲明 04 格式 4.1 大括號 4.3 一行一個語句 4.4 列限制&#xff1a;80 或 100 4…

MySQL Schema與數據類型的優化

選擇優化的數據類型&#xff1a; 1、 更小的通常更好&#xff1a; 一般情況下&#xff0c;應該盡量使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快&#xff0c;因為他們占用更少的磁盤&#xff0c;內存和cpu緩存&#xff0c;并且處理時需要的cpu周期也更少。 2、…

【Pix4d精品教程】Pix4d中央子午線細化設置(測區跨兩個分帶)

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 航測內業中,在自由空三結束之后,需要導入像控點,進而去刺像控點。但是當測區跨兩個分帶的時候(如測區正好處在3度帶105和108中間),像控點可能距離靶標點很遠,給刺點帶來了很大難度。怎樣解…

Failed:(13: Permission denied)導致訪問瀏覽器出現Nginx 500 Internal Server Error

1 、問題 我在部署nginx反向代理服務器的時候&#xff0c;nginx.conf文件都配置好了&#xff0c;但是我在瀏覽器里面輸入域名的時候&#xff0c;提示Nginx 500 Internal Server Error 2、分析 我們需要找到nginx輸出錯誤日志的文件&#xff0c;在nginx.conf里面我們可以看到錯…

MAUI與Blazor共享一套UI,媲美Flutter,實現Windows、macOS、Android、iOS、Web通用UI

1. 前言距離上次發《MAUI初體驗&#xff1a;爽》一文已經過去2個月了&#xff0c;本計劃是下半年或者明年再研究MAUI的&#xff0c;現在計劃提前啦&#xff0c;因為我覺得MAUI Blazor挺有意思的&#xff1a;在Android、iOS、macOS、Windows之間共享UI&#xff0c;一處UI增加或者…

dns 報文格式

最近學習了下DNS的格式&#xff0c;發現很多內容都是轉載自同一個而且說的不是很清楚&#xff0c;特再整理下具體可以查看RFC1035 http://www.ietf.org/rfc/rfc1035.txt有詳細的解釋對于英語理解不是很好和懶得看這么長的可以看下本文首先是DNS數據幀的格式-------------------…

input file實現批量上傳

1、需求實現word批量上傳。 2、使用插件jquery-form.js 3、html代碼 注意 multiple"multiple" 1 <form id"frm_upload" method"post" enctype"multipart/form-data"> 2   <input type"file" id"filepath&qu…

【Pix4d精品教程】Pix4d修編正射影像DOM的兩種方法案例詳解

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) DOM修編前: DOM修編后: 文章摘要: Pix4d內業數據處理通常會生成點云、DSM和DOM等產品,DSM經過精編可以生成精準的DEM,而DOM一般情況下,存在比如房屋邊緣被拉花,或者存在噪點的情況

刪除Linux下/tmp目錄引起的不正常登錄系統

現象&#xff1a;/tmp占用400M的空間(里面全部是亂七八糟的東西) 動作&#xff1a;刪除/tmp目錄 后果&#xff1a;造成只能啟動到控制臺模式 應急&#xff1a; 1 創建目錄&#xff1a;#mkdir /tmp 結果系統在控制臺模式登錄和X windows模式登錄狀態間反復切換&#xff0c;不能進…

C語言試題八十五之狼追兔子問題

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 一只兔子躲…

[轉]快速使用FileProvider解決Android7.0文件權限問題

升級到Android7.0之后&#xff0c;啟動系統相機或者截圖&#xff0c;傳入URI的時候可能會導致程序閃退崩潰。這是因為7.0的新的文件權限導致的。下面是解決這個問題的快速解決方案。 問題代碼 在7.0可能會出問題的代碼&#xff1a; final String CACHE_IMG Environment.getExt…

終于找到了,開源的Vue3+.NET6通用管理后臺!

據說80%的.NET項目都是管理后臺&#xff0c;然而能用上Vue3.NET6的管理后臺并不多見。這里分享一套Vue3 Axios TS Vite ElementUI Plus .NET 6 WebAPI JWT SqlSugar的前后端分離架構的通用管理后臺源碼數據庫腳本&#xff0c;還有與之配套錄制的一組視頻教程&#xff0c;全部打…

【Pix4d精品教程】Pix4d模型成果導出OSGB并加載OSGB到EPS進行三維測圖完美案例教程

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 在垂直攝影中,Pix4d也可以生成漂亮的三維模型,并導出為OSGB,加載到EPS進行三維測圖。首先來看生成的三維格網紋理和EPS三維模型加載效果。 Pix4d生成的三維格網紋理: EPS加載OSGB模型效果: 文…

Vim 批量替換

假設在非Win系統下。 想批量替換文本不再是Ctrl&#xff0b;F那么簡單了&#xff0c; 一般用Vim來做批量替換&#xff0c; 略微復雜點&#xff1a; 比如將192.168.0.1替換為192.168.0.2 :%s/192.168.0.1/192.168.0.2/g

Android實現ListView(1)

昨天有個朋友問我Android ListView列表視圖&#xff0c;遇到了點錯誤&#xff0c;今天我給大家演示&#xff0c;具體實現見圖&#xff1a; 1&#xff1a;創建一個item布局layout/item.xml 2&#xff1a;創建一個ListViewActivity類&#xff0c;但是必須繼承ListActivity&#x…

WolframAlpha 的使用

WolframAlpha 1. 求解復雜方程組 ab?4abc2ac1直接點開網站&#xff0c;在輸入框中輸入&#xff0c;ab-4;abc2;ac1;&#xff08;逗號分割開來&#xff09;&#xff0c; 轉載于:https://www.cnblogs.com/mtcnn/p/9423087.html

C語言試題八十六之兔子生兔子問題

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 假設一對兔…