.NET 6 Minimal API 的經驗分享

Minimal API 是 .NET 6 提供的最新功能 , 對比傳統的 ASP.NET Core Web API 方式更加直接 , 你可以用幾行代碼編寫好 REST API 。 沒有了祖傳的 Startup.cs 和 Controller ,通過簡單的代碼就可以完成 API 的開發。在第二階段的 .NET 挑戰賽中就以 .NET 6 中 的 Minimal API 作為學習的主線來完成相關的云原生應用。 有小伙伴問怎么可以用好 Minimal API ,如何去架構一個 Minimal API 的云原生解決方案 ,下面我和大家說說 。

再來認識一下 Minimal API

對比起傳統的 Web API , Minimal API 取消了 Controller , 文件的組織方式更像 Node.js . 在以前要啟動一個 Web API , .NET 對比起 JavaScript , Go , Rust , Python 等語言的 Web 框架還是相對復雜的。 .NET 團隊希望通過 Minimal API 簡化 .NET Web 框架 ,讓開發者能在一個文件完成簡單 API 構建。以下是一個最基本的 Minimal API 項目。

MapGet 是 EndpointRouteBuilderExtensions 類的擴展方法, 你可以看到它設定了路由規則后, 會傳遞一個委托參數 , 編譯器會將它轉換為 RequestDelegate ,通過它來取代 Controller 的工作。然后使用 app.Run() 方法來運行我們的 Minimal API 應用程序。
?

架構 .NET 6 Minimal API 項目

在傳統的 Web API 通過 Controller ,針對不同的功能進行 CRUD 的開發, 但如果我們是 Minimal API 呢 , 要如何組織呢 ? 還有我們是否還能用 Repository Pattern 呢 ?

1. Controller 再見

假設我們要搭建一個關于課程信息的 API, 有課程基本信息(課程類型,課程列表)和選課信息(學生選課,每門課學生選課信息),如果從傳統 Web API 你需要添加 CourseController 和 BookController 兩個控制器,通過不同 Action 去對應相關路由 ,但對于 Minimal API 如果我們涉及很多的路由就會讓我們的 Program.cs 文件過大,非常不好管理。那我們把功能點切分,或者說重新模擬 Controller 去劃分還是非常好的。

如上圖 ,是我畫的一個圖 ,通過把 Course 和 Book 劃分為兩個 Module , 在 Module 里都包含了路由的設置 。這個時候我們做一個接口 ,因為每個 Module 都需要包含添加路由的方法,所以把它做成一個接口 IBaseModule ,以后不同的 Module 都可以用 。

?如何添加進去 Program.cs ? 我們來用一個 IEndpointRouteBuilder 的擴展方法 ,把路由添加都歸類進來

public static class ModuleExtensions
{public static void Routers(this IEndpointRouteBuilder builder){CourseModule courseModule = new CourseModule();BookModule bookModule = new BookModule();courseModule.AddModuleRoutes(builder);bookModule.AddModuleRoutes(builder);}
}

這里有一個技巧就是我們可以通過以下 typeof 找到繼承于 IBaseModule 的 Module 并將它實例化后調用添加路由的方法。

    public static void Routers(this IEndpointRouteBuilder builder){var modules = typeof(IBaseModule).Assembly.GetTypes().Where(p => p.IsClass && p.IsAssignableTo(typeof(IBaseModule))).Select(Activator.CreateInstance).Cast<IBaseModule>();foreach(var module in modules){module.AddModuleRoutes(builder);}}

2. Repostitory 模式能延續嗎 ?

這是毫無疑問可以繼續使用。 通過 Repository 模式你不需要去關心你所使用的 ORM 是什么 , 與 ORM 的所有處理過程都在 Repository 層中處理掉 , 通過這樣去減少耦合, 提供更好的可測試性。在微軟文檔中,有以下的比較

在 Minimal API 使用 Repository Pattern 在整體上和傳統的 ASP.NET MVC 沒有不同 ,這里是我用 Repository 模式架構的 Minimal API 的截圖

?注意一點有人認為 Repository 模式有點過時 ,和過度架構 , 但我覺得還是非常有必要的,因為這樣可以更好管理你的項目。

3. 依賴注入

依賴注入解決了應用程序如何獨立于對象創建方式的問題。 當您需要可配置的應用程序單元測試時,這非常有用。 隨著應用程序的規模和復雜性的增長,依賴注入可幫助您更輕松地更改應用程序。 在 ASP.NET Core 中有非常好用的依賴注入方式 , 這點在 Minimal API 也是。 由于我們針對功能模塊去管理 ,所以在依賴注入時也可以針對模塊功能去進行 。以下是我針對模塊依賴注入的設計, 結合 Repository 模式以及上面提到的 ModuleExtension.cs 進行的調整 , 我也把關于數據連接公用的依賴注入也抽象了出來。

public static class ModuleExtensions
{static readonly List<IBaseModule> moduleList = new List<IBaseModule>(); private static IEnumerable<IBaseModule> GetModules(){var modules = typeof(IBaseModule).Assembly.GetTypes().Where(p => p.IsClass && p.IsAssignableTo(typeof(IBaseModule))).Select(Activator.CreateInstance).Cast<IBaseModule>();return modules;}public static void Routers(this IEndpointRouteBuilder builder){foreach(var module in moduleList){module.AddModuleRoutes(builder);}}public static void AddIoC(this IServiceCollection services){foreach(var module in GetModules()){module.AddModuleIoC(services);moduleList.Add(module);}}public static void AddGlobalConfig(this IServiceCollection services){services.AddScoped<CourseDataContext>();services.AddScoped<IUnitOfWork, UnitOfWork>();}}

?注意一些地方 , 雖然在 Minimal API 上 ,我們的依賴注入雖然把不同的Services 注冊了單例給 RequestDelegate 所調用 , 但在作為參數傳送時,要添加 [FromServices] 屬性標簽才有效 , 如下

app.MapGet("/Course/GetCourse" ,([FromServices] ICourseService courseService , int typeID)=> { return courseService.GetCourseList(typeID); });

Minimal API or Web API

在 ASP.NET Core 中開發 API 時,你 90% 都在使用 ASP.NET Core MVC。 而當你使用 ASP.NET Core MVC 架構 Web API 時 , 你會發現有點復雜 , 你需要符合 ASP.NET Core MVC 的所有要求 。 而 Minimal API 正好解決了這些問題 , 特別對于一些只做 API 或者 入門的開發者, 只需要簡潔的代碼就能完成類似 Node.js 一樣的工作 。有人問我 Minimal API 會取代傳統的 Web API 嗎 ? 我可以告訴大家不會。還是那句話 , 選擇符合項目需求的方法才是正道的。

小結

在云原生的年代 , Minimal API 是 .NET 的又一把利器 。 .NET 6 的 Minimal API 要用好 ,實際上還是用到不少舊知識,像 Module 的構建方式,我參考了開源的 Carter(?GitHub - CarterCommunity/Carter: Carter is framework that is a thin layer of extension methods and functionality over ASP.NET Core allowing code to be more explicit and most importantly more enjoyable.?) , 像 Repository 模式還是沒有變 ,當然還是那些熟悉的語法 C# , 這就是我們常說的 ”萬變不離其中“ 。 Minimal API 不是要取代 Web API , 更多是給開發人員多一個選擇 。作為 .NET 學習挑戰賽知識點的補充 , 希望能給各位小伙伴更深刻了解 Minimal API 在實際應用場景的技巧 。本次的示例代碼也放到我的 GitHub 上了 ,如果各位小伙伴感興趣可以訪問該鏈接獲取完整的代碼?GitHub - kinfey/MinimalAPIDemo 。

相關資源

  1. 學習 Minimal API , 請訪問該鏈接?最小 API 概述 | Microsoft Docs

  2. 學習 Repository 模式 , 請訪問該鏈接?在 MVC 應用程序中實現存儲庫和工作單元模式 ASP.NET 10 (9) | Microsoft Docs


---------------------
作者:kinfey
來源:CSDN
原文:https://blog.csdn.net/kinfey/article/details/124534359
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

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

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

相關文章

JavaWeb之Filter過濾器

原本計劃這一篇來總結JSP&#xff0c;由于JSP的內容比較多&#xff0c;又想著晚上跑跑步減減肥&#xff0c;所以今天先介紹Filter以及它的使用舉例&#xff0c;這樣的話還有些時間可以鍛煉鍛煉。言歸正傳&#xff0c;過濾器從字面理解她的話有攔網、過濾的功能&#xff0c;可以…

【ArcGIS微課1000例】0054:尺寸注記的創建與編輯

尺寸注記要素是一種特殊類型的文本,用于顯示地圖上的長度或距離,可以創建各種形狀的尺寸注記要素,如對齊、簡單對齊、水平線狀、垂直線狀和旋轉線狀等。 文章目錄 一、創建尺寸注記1. 直接創建尺寸注記要素2. 通過已有尺寸注記要素創建二、編輯尺寸注記1. 刪除尺寸注記要素2…

利用python實現批量查詢ip地址歸屬地址

今天需要查詢nginx訪問的客戶端ip是否和調度一樣&#xff01;先是用shell把文件中的ip截取出來&#xff1a; python腳本如下&#xff1a;&#xff08;哈哈&#xff0c;新手寫的很草率&#xff09;#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

Cobbler部署之FAQ處理

Cobbler報錯處理 通過cobbler check檢查出現的報錯 紅色標注為報錯關鍵信息 9.1 報錯一 # cobbler check httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Original traceback: Traceback (most recent call last): File "/usr…

基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

堪比JMeter的.Net壓測工具 - Crank 入門篇

1. 前言 Crank 是.NET 團隊用來運行基準測試的基準測試基礎架構&#xff0c;包括&#xff08;但不限于&#xff09;來自TechEmpower Web 框架基準測試的場景,是2021年.NET Conf 大會上介紹的一項新的項目&#xff0c;其前身是Benchmarks。 Crank目標之一是為開發人員提供一種工…

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地類型的矢量圖層

Globalmapper中可以很方便的根據指定的字段,對矢量數據進行批量提取,生成不同類型的多個矢量數據,本文以土地利用現狀數據為例,基于DLMC,提取出不同用地類型的矢量圖層。 參考閱讀:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量篩選不同類型的圖斑(以土地利用數據…

javascript閉包—圍觀大神如何解釋閉包

閉包的概念已經出來很長時間了&#xff0c;網上資源一大把&#xff0c;本著拿來主意的方法來看看。 這一篇文章 學習Javascript閉包&#xff08;Closure&#xff09; 是大神阮一峰的博文&#xff0c;作者循序漸進&#xff0c;講的很透徹。下面一一剖析。 1.變量的作用域 變量的…

298. Binary Tree Longest Consecutive Sequence

題目&#xff1a;Given a binary tree, find the length of the longest consecutive sequence path. The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to…

Educational Codeforces Round 37 (Rated for Div. 2)

Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 題意&#xff1a;Max想給花園澆水。花園可被視為長度為n的花園床&#xff0c;花園內共有k個水龍頭&#xff0c;分別在花園的xi&#xff08;0≤xi<n&#xff09;處&#xff0c;在j秒內花園的[xi-(j-1…

詳解 .Net6 Minimal API 的使用方式

隨著 .Net6 的發布&#xff0c;微軟也改進了對之前 ASP.NET Core 構建方式&#xff0c;使用了新的 Minimal API 模式。以前默認的方式是需要在 Startup 中注冊 IOC 和中間件相關&#xff0c;但是在 Minimal API 模式下你只需要簡單的寫幾行代碼就可以構建一個 ASP.NET Core的We…

.NET 20周年專訪 - 張善友:.NET 技術是如何賦能并改變世界的

點擊藍字關注我們今年是 .NET 發布20周年&#xff0c;值此20周年之際&#xff0c;微軟 Reactor 特別策劃了 .NET 20周年系列主題專訪。我們邀請了數位中國 .NET 領域的技術專家以及社區名人&#xff0c;來聊聊他們與 .NET 的情緣、認識 .NET 的契機、選擇 .NET 的理由&#xff…

【ArcGIS錯誤異常100問】之005:ArcGIS字段計算器python中文編碼問題解決

問題描述&#xff1a; 現因工作的需要&#xff0c;對照2017最新版&#xff1a;《土地利用現狀分類》&#xff08;GBT 21010-2017&#xff09;&#xff0c;需根據DLMC對DLBM進行批量修改&#xff0c;如旱地是0103&#xff0c;其他林地是0307等&#xff0c;共計19種用地類型。 問…

【ArcGIS微課1000例】0055:根據圖層創建自定義圖例符號案例教程

在利用ArcGIS作圖時,有時候需要根據線狀或面狀圖層自己的矢量形狀去創建圖例項目符號,本文講解根據圖層創建自定義圖例符號。 本實驗使用的數據為配套案例數據包中的0055.rar中的水庫數據。 文章目錄 1. 添加“新建圖例圖面形狀”工具2. 根據圖層形狀創建符號3. 繪制形狀符號…

jQuery 3.3.1已經發布,開發團隊正在準備4.0版本

\看新聞很累&#xff1f;看技術新聞更累&#xff1f;試試下載InfoQ手機客戶端&#xff0c;每天上下班路上聽新聞&#xff0c;有趣還有料&#xff01;\\\jQuery 3.3.1已經發布&#xff0c;其中包含了許多新特性也提出要移除幾個之前的特性&#xff0c;移除一些特性是為了jQuery …

C#.NET版本、Visual Studio版本對應關系

C#版本.NET版本Visual Studio版本發布日期特性C# 1.0.NET Framework 1.0Visual Studio .NET 20022002-02-13委托、事件C# 1.1.NET Framework 1.1Visual Studio .NET 20032003-04-24APM&#xff08;異步編程模型&#xff09;C# 2.0.NET Framework 2.0Visual Studio 20052005-11-…

真魔法!圖形化管理 Kafka 超輕量的自動化工具

Kafka Magic[1] 是一個用于處理 Apache Kafka 集群的 GUI 工具。它可以查找和顯示消息、在 Topic 之間轉換和移動消息、查看和更新模式、管理 Topic 以及自動化復雜任務。Kafka Magic 通過方便的用戶界面促進 Topic 管理、QA 和集成測試。Kafka Magic Community Edition 可免費…

前端工程構建工具——Yeoman

一、Yeoman 簡介 通常在開發新項目時我們都需要配置工程環境&#xff0c;開發目錄&#xff0c;需要下載一些庫、框架文件&#xff08;如 jQuery、Backbone 等&#xff09;&#xff0c;配置編譯環境&#xff08;Less、Sass、Coffeescript等&#xff09;&#xff0c;甚至還要配置…

【FME實戰教程】001:FME2020中文安裝圖文教程(附安裝包下載)

文章目錄1. 安裝license2. 安裝FME Desktop3. 安裝中文語言4. FME軟件下載地址1. 安裝license 打開軟件安裝包中的fme-flexnet-win-x64.msi&#xff0c;如下圖所示&#xff1a; 點擊Next。 點擊Next。 單擊install。 點擊finish&#xff0c;完成。 &#xff08;1&#xff09;修…

算法導論 第三部分——基本數據結構——第14章:數據結構的擴張

本章通過擴張紅黑樹構造出兩種數據結構&#xff1a;動態順序統計和區間樹。 1、動態順序統計&#xff1a;查找倒數第i小的數據 復雜度為 lg(n) 為什么是擴張紅黑樹而不是搜索二叉樹或者二叉樹&#xff1f; 相對于搜索二叉樹&#xff0c;紅黑樹的平衡性更好&#xff0c;高度在l…