dotNET 7:最小 API 使用

dde3a8a4e4b7ea9fa529854e41ca111b.jpeg

最小 API 并不是在 .NET 7 中才加入的,記得應該是在 .NET 6 中就已經提供,只是對我來說,到現在才開始使用。

創建一個最小 API

在 VS 2022 中創建 WebAPI 項目,不勾選使用控制器,創建出來的就是最小 API :

d526c258f5410977304fafa7532de10c.png

  • 不勾選使用控制器,就會創建最小 API 模板;

  • 啟用 OpenAPI ,默認會添加 Swagger;

  • 頂級語句:頂級語句是 C# 9.0 中添加的新特性,如果勾選不使用,Program 類中還會出現 main 函數。

創建出來的工程只有兩個文件,重大的改變就是,沒有之前的 Startup 類了,只有一個 Program 和一個配置文件 appsetting.json:

2355d9c8786a030e2cf1a2066a2374c8.png

Program 類的全部代碼如下:

var?builder?=?WebApplication.CreateBuilder(args);
//在下面添加服務器到容器,相當于之前?Startup?類中的?ConfigureServices?方法var?app?=?builder.Build();
//在下面編寫管道相關代碼,相當于之前?Startup?類中的?Configure?方法//在下面編寫接口,相當于之前?Controller?中的方法
var?summaries?=?new[]
{"Freezing",?"Bracing",?"Chilly",?"Cool",?"Mild",?"Warm",?"Balmy",?"Hot",?"Sweltering",?"Scorching"
};app.MapGet("/weatherforecast",?()?=>
{var?forecast?=?Enumerable.Range(1,?5).Select(index?=>new?WeatherForecast(DateOnly.FromDateTime(DateTime.Now.AddDays(index)),Random.Shared.Next(-20,?55),summaries[Random.Shared.Next(summaries.Length)])).ToArray();return?forecast;});//運行?API
app.Run();internal?record?WeatherForecast(DateOnly?Date,?int?TemperatureC,?string??Summary)
{public?int?TemperatureF?=>?32?+?(int)(TemperatureC?/?0.5556);
}

app.MapGet 方法接受兩個參數,第一個參數是一個字符串,為接口的訪問路徑,第二個參數是一個委托,用來編寫接口的業務邏輯。

從 MapGet 這個方法名可以看出,這是一個 Get 請求的接口方法,如果要使用 Post ,可以使用 MapPost 。

添加一個接口方法非常簡單,如下圖:

a70552541069150d2f8902839fb814b1.png


使用 Serilog 日志框架

1、安裝 NuGet 包:Serilog.AspNetCore,安裝這一個就會包含 Serilog 、Serilog.Sink.File 等。

2、在 Program 類的 builder 創建之后,添加對 Serilog 的使用:

using?Serilog;var?builder?=?WebApplication.CreateBuilder(args);
//在下面添加服務器到容器,相當于之前?Startup?類中的?ConfigureServices?方法
//添加對?serilog?的使用
builder.Host.UseSerilog((hostContext,?services,?configuration)?=>?{configuration.WriteTo.File("serilog-file.txt").WriteTo.Console();
});
var?app?=?builder.Build();
//?下面代碼省略

3、運行程序,會看到項目更目錄下會生成一個 serilog-file.txt 文本文件,里面記錄了所有日志;

4、在上面添加的 helloworld 方法中使用日志:

app.MapGet("/helloworld", () =>?
{Log.Information("helloworld.start");return "hello ,oec2003";});
  • Information 是日志級別,還有 Error、Warning、Fatal、Debug;

  • 接口方法調用后,日志會寫入文本文件。

依賴注入

依賴注入一個常見的做法是使用構造函數進行注入,傳統的 WebAPI 中可以在 Controller 的構造函數中進行,但最小 API 沒有 Controller ,下面看看在最小 API 中是怎么注入的。

1、在 Program 類的最下面添加 IUser 接口和 User 類:

internal?interface?IUser
{string?GetName();
}
internal?class?User?:?IUser
{public?string?GetName(){return?"oec2003";}
}

2、在 Program 類的 builder 創建之后,添加依賴注入的配置:

builder.Services.AddTransient<IUser,?User>();

3、注入的地方由原來的構造函數變成了方法參數:

app.MapGet("/helloworld",??(IUser?user)?=>?
{return?$"hello?,?{user.GetName()}";});

配置

最小 API 的項目中的兩個文件,其中一個就是 appsetting.json 配置文件,下面以 Serilog 日志框架的配置為例,來演示怎樣讀取配置文件。

1、在上面的 Serilog 例子中,配置是在代碼中寫死的,現在將配置移到 appsetting.json 配置文件中。

"Serilog":?{"MinimumLevel":?"Information","Override":?{"Microsoft.AspNetCore":?"Warning"},"WriteTo":?[{"Name":?"Console"},{"Name":?"File","Args":?{"path":?"Serilogs\\serilog.log"}}]
}

2、修改 builder 部分的代碼:

builder.Host.UseSerilog((hostingContext,?loggerConfiguration)?=>????????????????loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));

3、運行程序后,在程序根目錄下會創建 Serilogs 目錄,該目錄中會創建 serilog.log 文件。

總結

1、對于一些簡單的接口場景,使用最小 API 比較方便,都在一個文件中處理;

2、除了依賴注入式通過方法參數,其他很多地方跟之前用法類似,就是將 Startup 中 ConfigureServices 方法和 Configure 方法搬到了 Program 類的固定位置。

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

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

相關文章

Taro小程序采坑記

Taro&#xff0c;京東凹凸實驗室出品的適配多端的一個框架&#xff0c; Taro 是一套遵循 React 語法規范的 多端開發 解決方案。現如今市面上端的形態多種多樣&#xff0c;Web、React-Native、微信小程序等各種端大行其道&#xff0c;當業務要求同時在不同的端都要求有所表現的…

struts入門

struts工作過程&#xff1a; 反射代碼&#xff1a; Class clazz Class.forName("action全路徑"); Method m clazz.getMethod("execute"); Object o m.invoke(); package標簽&#xff1a; 轉發&#xff1a;地址欄不變 修改struts默認常量值&#xff1a; 常…

《Android應用開發攻略》——2.14 備份Android應用程序數據

2.14 備份Android應用程序數據 Pratik Rupwal2.14.1 問題當用戶恢復出廠設置或者改用新的Android設備時&#xff0c;應用程序丟失存儲數據或者應用程序設置。2.14.2 解決方案Android的Backup Manager&#xff08;備份管理器&#xff09;能夠在應用程序重新安裝時自動恢復備份數…

C#程序開機啟動與獲取程序啟動路徑

寫windows工具時&#xff0c;要進行電源管理&#xff0c;需要重啟與開關機OS&#xff0c;這樣工具就需要自動啟動。查了網上很多資料&#xff0c;修改注冊列表就可以。 但是&#xff0c;復制幾個網站的代碼并自己修改都發現不行&#xff0c;最后發現腳本之家這段代碼才成功&am…

wpf office 菜單_如何帶回Office 2007中的舊菜單

wpf office 菜單Using the new Ribbon feature in Office 2007 takes time to learn…time you don’t have because projects are stacking up. Today we will look at UBitMenu, a utility that puts the familiar Office 2003 menu into the 2007 ribbon. 使用Office 2007中…

Swagger UI 僅為用戶暴露已授權終結點

前言當需要在生產環境中提供 Swagger UI 時&#xff0c;我們可以通過身份驗證&#xff0c;控制只有授權用戶才能訪問 Swagger UI 頁面。但是我們希望更進一步&#xff0c;每個用戶只能看到授權給他的終結點&#xff0c;而不會暴露其他未授權終結點信息。比如&#xff0c; API 提…

php實現約瑟夫環

function king($high,$size){ $monkey range(1, $high); $i 0 ; while (count($monkey)>1) { $i; $head array_shift($monkey); if(($i % $size) ! 0){ array_push($monkey,$head); } } return $monkey[0];} var_dump(king(10,3));轉載于:https://www.cnblogs.com/lijint…

微軟正式發布Azure Storage上的靜態網站

微軟正式宣布了Azure Storage上的靜態網站&#xff0c;提供了從托管在Azure Storage上的HTML、CSS和JavaScript文件提供內容的能力。靜態網站包含內容固定的Web頁面&#xff0c;同時仍然允許利用JavaScript等客戶端代碼來創建豐富的用戶體驗。 有了這個新功能&#xff0c;繼用于…

帝國國王科技大學上機題解(二)

1.找到字符串中出現次數最少的字符 題目描寫敘述 給定一個字符串&#xff08;長度小于50&#xff09; 找到該字符串出現次數最少的字符 假設有兩個字符出現次數同樣&#xff0c;并且均出現最少。那么ASCII碼小的字符優先 輸入 輸入為一行字符串。不含空格 輸出 輸出出現次數最少…

如何在計算機上閱讀漫畫書

Reading and organizing a comic book collection on your computer is efficient and a lot of fun. Today we will look at a couple of free applications that allow you to read your favorite comic books on your computer. 在計算機上閱讀和組織漫畫集非常有效&#xf…

C# WinForm 自啟動/模擬開機自動啟動

遇到重寫啟動步驟&#xff0c;C#調試時顯得比較折騰&#xff0c;既要等待重啟&#xff0c;又要保存當前文件。 讓程序自動重啟模擬這樣電腦重啟步驟&#xff0c;顯得非常方便。在http://bbs.csdn.net/topics/100187453找到下面代碼&#xff0c;直接使用。 ProcessStartInfo p…

工業互聯網平臺實現路徑

我國工業互聯網平臺建設雖然仍處于產業培育期&#xff0c;但是工業互聯網平臺也得到了初期的快速發展&#xff0c;得益于平臺企業的積極投入和各地工業和信息化主管部門的大力推動&#xff0c;從平臺建設推廣的經驗來看&#xff0c;下面談一下個人認為傳統制造企業平臺戰略比較…

Javascript基礎之-Promise

轉載自: http://www.lht.ren/article/3/ Promise是什么呢&#xff1f;根據ecma-262的定義&#xff1a; Promise是一個被用于延時計算的最終結果的占位符 &#xff08;A Promise is an object that is used as a placeholder for the eventual results of a deferred (and possi…

linux進階命令2

linux進階命令2 壓縮1.壓縮的概念1&#xff09;壓縮的目的&#xff1a; 在網絡傳遞文件時&#xff0c;可以先將文件壓縮&#xff0c;然后傳遞壓縮后的文件&#xff0c;從而減少網絡帶寬。 接受者接受文件后&#xff0c;解壓即可。2&#xff09;壓縮的類型 有損壓縮、無損壓縮。…

PHP經常使用正則表達式匯總

1. 平時做站點常常要用正則表達式&#xff0c;以下是一些解說和樣例&#xff0c;僅供大家參考和改動使用&#xff1a; 2. "^\d$"  //非負整數&#xff08;正整數 0&#xff09; 3. "^[0-9]*[1-9][0-9]*$"  //正整數 4. "^((-\d)|…

psa name_Windows 10安全性PSA:啟用自動商店更新

psa nameMicrosoft sometimes distributes important security updates through the Microsoft Store. That’s the lesson we’re learning in July 2020, when Microsoft sent an important update for Windows 10’s HEVC codecs not via Windows Update but via the Store.…

C# ListView 簡單命令例子

編寫工具常用到ListView控件&#xff0c;能簡單列出選項&#xff0c;常用到流程校驗顯示。這里介紹簡答顯示&#xff0c;添加與刪除功能。 1.添加表頭&#xff0c;與顯示。 this.listView1.Columns.Add("隊列", 40, HorizontalAlignment.Left);this.listView1.Column…

C#并行編程-Task

什么是異步同步和異步主要用于修飾方法。當一個方法被調用時&#xff0c;調用者需要等待該方法執行完畢并返回才能繼續執行&#xff0c;我們稱這個方法是同步方法&#xff1b;當一個方法被調用時立即返回&#xff0c;并獲取一個線程執行該方法內部的業務&#xff0c;調用者不用…

手機照片丟失或誤刪如何恢復

手機照片丟失或誤刪如何恢復&#xff1f;我們每個人從剛出生就開始拍照片&#xff0c;一周歲照片、二周歲照片、三周歲照片等&#xff0c;因為照片可以記錄我們從小到大的模樣和變化。無意照片對我們每個人來說都很重要&#xff0c;如果手機突然壞以前的照片都找不到了怎么辦呢…

C++學習筆記(二)——交換函數(swap)

這次我們要透過一個簡單的函數swap深入理解函數傳參的本質以及在C中如何選擇傳參方式。 先來看第一段程序&#xff1a; void swap(int x, int y) {int temp y;y x;x temp; } 通過main函數的調用&#xff0c;我們發現x,y并未實現交換&#xff1a; int main() {int x 1;int y…