ASP.NET8.0入門與實戰

1、項目初始化

創建一個ASP.NET Core Web API的項目,取消Https和身份驗證。

API項目實際上是一個控制臺程序,這點可以在項目的屬性的輸出類型中看到。

launchSettings.json,在這里可以配置運行項目的名稱,端口號,路徑等。

在Program.cs文件中對項目的構造器和中間件進行了配置,首先是創建構造器,添加控制器,終結點,Swagger,構建構造器。在中間件模塊里首先是判斷是否是開發模式,如果是的話便開始注冊Swagger和它的UI界面,授權,路由映射。

最后是運行項目,在Swagger中調用接口可以看到返回值,如果是簡單的項目比如一個只有OCR功能的項目是不需要另外再創建其他項目的,除非是一個比較復雜的才需要創建多個層級的項目。

2、倉儲+服務架構模式講解

這一節開始搭建項目,搭建項目很重要,會影響日常開發和維護的流程,這里采用的是這種架構:

1、接口層(控制器)暴露在最外面,由它去調用服務層;

2、服務層是個中轉站,它會去調用倉儲層拿到數據庫實體,并映射為數據模型對象Vo,這里的Vo應該與倉儲層的數據庫實體有差異,避免暴露一些關鍵信息,比如隱藏ID,修改字段名;另外一個好處是假如數據庫的數據做了遷移,需要修改字段名,只需要修改數據實體即可,無需修改Vo,前端是不用動的,減少了開發量。

3、倉儲層與數據庫做交互,拿到數據庫實體,它也會去調用公共層的代碼,現在在底層引用了一個類庫后,引用它的項目的引用的項目也能使用這個類庫,就很方便不用重復引用了,而且避免出現不同的版本。

還有就是在服務層和倉儲層都定義了一套實現類與接口類,設計到延遲的功能都使用了異步和等待。

Mock了一個數據 = 造假數據,具體來說就是將定義好的數據寫到程序中,作為固定返回,C#中有專門做假數據的類庫。

3、泛型基類的妙用

這一節在倉儲層和服務層定義了一對抽象化的類與接口,IBaseRepository和BaseRepository,通過往里面傳入泛型的方式簡化了類和接口的創建,但這樣寫是無法處理復雜的業務邏輯的。

    public interface IBaseRepository<TEntity> where TEntity : class{Task<List<TEntity>> Query();}

    public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class, new(){public async Task<List<TEntity>> Query(){await Task.CompletedTask;var str = "[{\"Id\":1, \"Name\":\"李四\"}]";var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TEntity>>(str) ?? new List<TEntity>();return list;}}

4、泛型對象的關系映射

由于上一節最終返回的是一個數據模型而不是視圖模型,所以需要用到AutoMapper讓兩種類型實現一次配置后自動轉換。

具體步驟:

1、下載Nuget包,AutoMapper 12.0.1,AutoMapper.Extensions.Microsoft.DependencyInjection 12.0.0

2、創建配置文件CustomProfile,可以看到里面是對兩個類里面屬性的一個映射,CreateMap的第一個是起始類Role,第二個是目標類RoleVo,值得注意的是ForMember的第一個參數卻是目標類RoleVo的屬性RoleName,第二個參數是起始類Role的屬性

    public class CustomProfile : Profile{public CustomProfile(){CreateMap<Role, RoleVo>().ForMember(a => a.RoleName, o => o.MapFrom(d => d.Name));CreateMap<RoleVo, Role>().ForMember(a => a.Name, o => o.MapFrom(d => d.RoleName));}}

另外還需要創建一個AutoMapper的配置文件AutoMapperConfig,這個在后面的注入環節會用到。

3、在Program的Main函數中對AutoMapper進行構建

    builder.Services.AddAutoMapper(typeof(AutoMapperConfig));AutoMapperConfig.RegisterMappings();

然后在服務層使用它,這里需要進行依賴注入,然后使用AutoMapper的Map方法,泛型是目標類,入參是起始類。

    public class BaseService<TEntity, TVo> : IBaseService<TEntity, TVo> where TEntity : class, new(){public readonly IMapper _mapper;public BaseService(IMapper mapper){_mapper = mapper;}public async Task<List<TVo>> Query(){var baseRepository = new BaseRepository<TEntity>();var entities = await baseRepository.Query();return _mapper.Map<List<TVo>>(entities);}}

5、依賴注入

雖然使用依賴注入需要進行額外的配置,但好處多多,比如不用擔心內存泄漏,何時被GC回收。

在Main函數中對創建的類進行注冊有三種模式:Singleton、Scoped、Transient

Singleton可以理解為單例模式,只有一個實例,是全局的。

Scoped可以理解為在一次請求中用到的是同一個實例,例如:在一個Action中,如果兩次用到同一個實例,在這種模式下將會是相同的。

Transient可以理解為瞬時的,例如::在一個Action中,如果兩次用到同一個實例,在這種模式下將會是不同的。

最常用的還是Scoped模式,在ASP.NET中在Action中使用new關鍵字創建的對象的時候也是這種方式。

ASP.NET Core和ASP.NET一個很明顯的區別就在于應盡量避免去new一個對象,而是通過依賴注入來獲得它。

具體步驟:

1、在Main函數注入服務類

builder.Services.AddScoped(typeof(IBaseService<,>), typeof(BaseService<,>));

2、在Controller中通過構造函數拿到它,然后在Action中使用

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

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

相關文章

Synopsys 邏輯綜合的整體架構概覽

目錄 一、DC Shell 邏輯綜合的整體架構概覽 ?? 邏輯綜合的主要階段&#xff08;Pipeline&#xff09; 二、核心架構模塊詳解 1. Internal Database&#xff08;設計對象數據庫&#xff09; 2. Scheduler&#xff08;調度器&#xff09; 3. Rewriting Engine&#xff08…

低壓電工常見知識點

一.工廠用電 1.工廠一般有電源380V和220V。 三相:黃綠紅 藍 雙色 助記符:王力宏 分別對應第一相(R),第二相(S)&#xff0c;第三相(T)&#xff0c;零線(N),地線(PE) 單相:紅 黑 對應火線(L) 零線(N) 左零右火 二.人體安全電壓是36V 三.變壓器的講解 變壓器的符號…

【沉浸式求職學習day27】

沉浸式求職學習 家人們誰懂啊&#xff01;明天下午又實習筆試了&#xff0c;所以今天大部分時間還是在搞一些行測之類的東西&#xff0c;所以今天沒什么分享給大家的&#xff0c;明晚會簡單的和大家分享一下關于數據庫的一些東西&#xff0c;以及和大家聊聊我筆試的感覺哈哈哈哈…

進入救援模式(物理服務器)

目錄 **?? 準備工作****?? 進入救援模式(物理服務器)****方法 1:直接修改啟動參數****適用情況****操作步驟****方法 2:通過GRUB引導菜單進入(系統未完全崩潰時)****適用情況****操作步驟****兩者的核心區別****如何選擇?****注意事項****總結**當物理服務器無法正常…

基于Pytest接口自動化的requests模塊項目實戰以及接口關聯方法詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 1、基于pytest單元測試框架的規則 1.1 模塊名&#xff08;即文件名&#xff09;必須以test_開頭或者_test結尾 1.2 類名必須以Test開頭且不能有init方法 1.3 用…

匯總 JavaScript 內置對象常用方法詳解

匯總 JavaScript 內置對象常用方法詳解 JavaScript 提供了許多強大的內置對象&#xff0c;它們帶有各種實用的方法&#xff0c;能夠幫助我們更高效地編寫代碼。本文將介紹最常用的內置對象方法&#xff0c;并通過實例展示它們的使用場景。 目錄 Array 數組String 字符串Obje…

OceanBase TPCC測試常見報錯匯總

OceanBase TPCC測試常見報錯匯總 報錯1:加載測試數據時創建tablegroup失敗報錯2:加載測試數據時執行超時報錯3:加載測試數據時funcs.sh函數找不到報錯4:加載數據時報錯超過租戶內存上限辦法一:增加租戶內存辦法二:調高轉儲線程數辦法三:調整MemStore內存占比和凍結觸發閾…

Flutter 在 Dart 3.8 開始支持 Null-Aware Elements 語法,自動識別集合里的空元素

近日&#xff0c;在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 語法&#xff0c;該語法糖可以用于在 List、Set、Map 等集合中處理可能為 null 的元素或鍵值對&#xff0c;簡化顯式檢查 null 的場景&#xff1a; /之前 var listWithoutNullAwareElements [if …

SAIL-RK3588協作機器人運動控制器技術方案

一、核心能力與政策適配? ?政策合規性? 滿足工信部《智能機器人重點技術攻關指南》要求&#xff0c;支持 ?EtherCAT主站協議&#xff08;符合IEC 61158標準&#xff09;?&#xff0c;助力企業申報工業機器人研發專項補貼&#xff08;最高300萬元/項目&#xff09;?核心板…

Eigen幾何變換類 (Transform, Quaternion等)

1. Transform 類&#xff1a;仿射/射影變換 模板參數 cpp Transform<Scalar, Dim, Mode, Options> Scalar&#xff1a;數據類型&#xff08;如 float, double&#xff09;。 Dim&#xff1a;維度&#xff08;2 或 3&#xff09;。 Mode&#xff1a;變換類型&#xf…

openGauss手工配置主備

1、初始化 創建一個操作系統用戶&#xff0c;例如postgres&#xff0c;為這個用戶設置PATH和LD_LIBRARY_PATH環境變量&#xff0c;指向opengauss/bin和opengauss/lib export GAUSSHOME/mnt/disk01/opengauss export PATH$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH$GAUSS…

CSS預處理器對比:Sass、Less與Stylus如何選擇

引言 CSS預處理器已成為現代前端開發的標準工具&#xff0c;它們通過添加編程特性來增強純CSS的功能&#xff0c;使樣式表更加模塊化、可維護且高效。在眾多預處理器中&#xff0c;Sass、Less和Stylus是三個最流行的選擇&#xff0c;它們各自擁有獨特的語法和功能特點。本文將深…

基于Docker、Kubernetes和Jenkins的百節點部署架構圖及信息流描述

以下是基于Docker、Kubernetes和Jenkins的百節點部署架構圖及信息流描述,使用文本和Mermaid語法表示: 架構圖(Mermaid語法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…

js中get,set用法

1、作為對象的訪問器屬性 //使用Object.definePropertylet obj {_a:123};Object.defineProperty(obj, "a", {get() {return this._a;},set(val) {this._aval},});console.log(obj.a); //123obj.a456console.log(obj.a) // 456 //使用對象字面量let obj {_a:123,ge…

Steam游戲服務器攻防全景解讀——如何構建游戲級抗DDoS防御體系?

Steam游戲服務器的DDoS攻防體系設計&#xff0c;從協議層漏洞利用到業務連續性保障&#xff0c;深度拆解反射型攻擊、TCP狀態耗盡等7類威脅場景。基于全球15個游戲廠商攻防實戰數據&#xff0c;提供包含邊緣節點調度、AI流量指紋識別、SteamCMD加固配置的三維防護方案&#xff…

【AI】SpringAI 第四彈:接入本地大模型 Ollama

Ollama 是一個開源的大型語言模型服務工具。它的主要作用是幫助用戶快速在本地運行大模型&#xff0c; 簡化了在 Docker 容器內部署和管理大語言模型&#xff08;LLM&#xff09;的過程。 1. 確保Ollama 已經啟動 # 查看幫助文檔 ollama -h# 自動下載并啟動 ollama run deeps…

大語言模型的評估指標

目錄 一、混淆矩陣 1. 混淆矩陣的結構&#xff08;二分類為例&#xff09; 2.從混淆矩陣衍生的核心指標 3.多分類任務的擴展 4. 混淆矩陣的實戰應用 二、分類任務核心指標 1. Accuracy&#xff08;準確率&#xff09; 2. Precision&#xff08;精確率&#xff09; 3. …

SpringBoot Gradle插件:構建與打包配置

文章目錄 引言一、Spring Boot Gradle插件基礎二、依賴管理與配置三、應用打包配置四、啟動腳本與運行配置五、多環境構建與配置六、集成Docker與云原生支持七、實踐案例&#xff1a;自定義Spring Boot應用構建總結 引言 在Java生態系統中&#xff0c;Gradle作為一種靈活且強大…

Vue3 組件通信與插槽

Vue3 組件通信方式全解&#xff08;10種方案&#xff09; 一、組件通信方式概覽 通信方式適用場景數據流向復雜度Props/自定義事件父子組件簡單通信父 ? 子?v-model 雙向綁定父子表單組件父 ? 子??Provide/Inject跨層級組件通信祖先 → 后代??事件總線任意組件間通信任…

【KWDB 創作者計劃】_嵌入式硬件篇---數字電子器件

文章目錄 前言一、系列前綴(如 "74" 或 "54")74(商用級)54(工業級)二、邏輯家族(如 "LS"、"HC"、"HCT" 等)TTL(晶體管-晶體管邏輯)家族CMOS(互補金屬氧化物半導體)家族BiCMOS(雙極 CMOS)家族三、功能編號(如…