NET.AutoApi原理揭秘

来源:https://www.cnblogs.com/norain/archive/2023/01/15/17052955.html
-Advertisement-
Play Games

前言 上一篇文章我們講了怎麼使用 NET.AutoApi 這個組件來動態生成webapi介面,讓我們不需要創建控制器去轉發業務層代碼。這篇文章主要是講解NET.AutoApi 底層是怎麼實現動態生成webapi介面 我們回顧下- NET.AutoApi 最終的效果 NET.AutoApi內部原理 其 ...


前言

上一篇文章我們講了怎麼使用 NET.AutoApi 這個組件來動態生成webapi介面,讓我們不需要創建控制器去轉發業務層代碼。這篇文章主要是講解NET.AutoApi 底層是怎麼實現動態生成webapi介面

我們回顧下- NET.AutoApi 最終的效果

NET.AutoApi內部原理

其實NET.AutoApi內部是藉助於mvc拋出來的擴展,進行動態配置webapi的,主要有以下這麼幾個地方

  1. 將當前程式集添加進ApplicationPartManager類中的ApplicationParts集合中
  2. 增加ApplicationModelConvention處理ApplicationModel,動態增加路由特性等

NET.AutoApi原理之源碼淺析詳解

其實NET.AutoApi 是基於 AspNet Mvc Core 的 builder.Services.AddControllers();app.MapControllers(); 去做的,微軟留下了很多支持自定義擴展的地方,所以我們看下這兩個方法中它幹了些啥。註意:我這邊只挑出NET.AutoApi中所用到的地方說,畢竟 mvc 的源碼很長

builder.Services.AddControllers();

  1. 第一點,AddControllers內部會調用AddMvcCore。做的第一件事就是將當前啟動程式集放到 ApplicationPartManager 類的ApplicationParts集合中

  1. 第二點:上圖中的ConfigureDefaultFeatureProviders 方法,請記住ApplicationPartManager對象中的這個集合FeatureProviders,以及這個類ControllerFeatureProvider

    註意FeatureProviders集合以及ControllerFeatureProvider,這個ControllerFeatureProvider類的作用是:用於找出(過濾)程式集(ApplicationParts集合)中的控制器類(PS:那麼我們只需要把我們的程式集添加到ApplicationParts集合中,然後增加一個FeatureProvider,可以將任何程式集中的類型,都添加為控制器類

  1. 第三點,添加一些若幹服務註入,我這邊只列舉出我們所需的,大家有興趣自己去看源碼

    • MvcOptions:這個配置內有一個我們需要的東西,Conventions集合屬性,

    這個IApplicationModelConvention 集合,可以對控制器類型和方法進行操作,賦予它路由及其它信息

  • services.TryAddSingleton():這個類很重要,它是將我們的控制器類型,轉換成ApplicationModel 

ApplicationModel內包含了,每個控制器類的元屬性(方法,路由信息、過濾器、特性標簽等等),大家註意:這裡會調用MvcOptions中的Conventions集合的Apply方法,我們可以自行添加Convention,這個時候可以將任何類都動態賦予路由等元屬性,那麼我們可以給一些原本不是控制器類型的類,添加路由信息,讓他具備控制器的特性。

  • services.TryAddSingleton<IActionDescriptorCollectionProvider, DefaultActionDescriptorCollectionProvider>();Transient<IActionDescriptorProvider, ControllerActionDescriptorProvider>()

這個DefaultActionDescriptorCollectionProvider 的類做了兩個事,

  1. 他會調用ApplicationModelFactory類的方法,將控制器類集合,轉換成ApplicationModel。
  2. 然後又將ApplicationModel轉換成ActionDescriptor集合

app.MapControllers();

  1. 開啟一個訂閱

  1. 將控制器方法,轉換成Endpoint對象(內部是一個RequestDelegate)

  • ControllerActionInvoker內部,這個類內部包含了整個請求流程處理,感興趣的朋友自己去看源碼,我這就不繞進去了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring基本介紹02 5.簡單模擬Spring基於XML配置的程式 5.1需求說明 自己寫一個簡單的Spring容器,通過讀取beans.xml,獲取第一個Javabean:Monster的對象,給該對象屬性賦值,放入到容器中,並輸出該對象信息 也就是說,不使用spring原生框架,我們自己簡單 ...
  • 前言 C 語言是一門功能強大的專業化編程語言,深受專業程式員和業餘編程愛好者的喜愛,同時 C 語言也是當今最流行的嵌入式開發語言。大多數嵌入式項目的開發都是用 C 語言來編寫的。 既然 C 語言這麼厲害,那學習 C 語言應該用什麼軟體呢? 推薦使用 Dev-Cpp 在這我推薦初學者使用 Dev-Cp ...
  • Go語言上手(一) 這是我參與「第五屆青訓營 -後端場」筆記創作活動的的第一篇筆記。 先上代碼倉庫: WenTesla/GoLang-Study: 一個學習Go的倉庫 (github.com) 這個倉庫下放下我目前學習GO的所有筆記以及代碼,還未整理,最後會將倉庫進行整理。 基礎語法 一:類型 GO ...
  • 1. 生成6位數字隨機驗證碼 import random import string def num_code(length=6): """ 生成長度為length的數字隨機驗證碼 :param length: 驗證碼長度 :return: 驗證碼 """ return ''.join(random ...
  • 本篇主要介紹Java NIO的基本原理和主要組件 Netty是由JBOSS提供的Java開源網路應用程式框架,其底層是基於Java提供的NIO能力實現的。因此為了掌握Netty的底層原理,需要首先瞭解Java NIO的原理。 NIO簡介 電腦主要由CPU、記憶體、外存、IO設備等硬體組成,電腦執行 ...
  • keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。 1、簡介 keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和 ...
  • 1 簡介 如果要選擇GCP為雲平臺,則經常需要創建GCE(Google Compute Engine),有以下幾種方式: (1) 在瀏覽器創建 (2) 命令 gcloud (3) Terraform 在開始之前,可以查看:《初始化一個GCP項目並用gcloud訪問操作》。 2 GCP Console ...
  • 前言 眾所周知記憶體緩存(MemoryCache)數據是從記憶體中獲取,性能表現上是最優的,但是記憶體緩存有一個缺點就是不支持分散式,數據在各個部署節點上各存一份,每份緩存的過期時間不一致,會導致幻讀等各種問題,所以我們實現分散式緩存通常會用上Redis 但如果在高併發的情況下讀取Redis的緩存,會進行 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 當別人做大數據用Java、Python的時候,我使用.NET做大數據、數據挖掘,這確實是值得一說的事。 寫的並不全面,但都是實際工作中的內容。 .NET在大數據項目中,可以做什麼? 寫腳本(使用控制台程式+頂級語句) 寫工具(使用Winform) 寫介面、寫服務 使用C#寫代碼的優點是什麼? ...
  • 前言 本文寫給想學C#的朋友,目的是以儘快的速度入門 C#好學嗎? 對於這個問題,我以前的回答是:好學!但仔細想想,不是這麼回事,對於新手來說,C#沒有那麼好學。 反而學Java還要容易一些,學Java Web就行了,就是SpringBoot那一套。 但是C#方向比較多,你是學控制台程式、WebAP ...
  • 某一日晚上上線,測試同學在回歸項目黃金流程時,有一個工單項目介面報JSF序列化錯誤,馬上升級對應的client包版本,編譯部署後錯誤消失。 線上問題是解決了,但是作為程式員要瞭解問題發生的原因和本質。但這都是為什麼呢? ...
  • 本文介紹基於Python語言中TensorFlow的Keras介面,實現深度神經網路回歸的方法。 1 寫在前面 前期一篇文章Python TensorFlow深度學習回歸代碼:DNNRegressor詳細介紹了基於TensorFlow tf.estimator介面的深度學習網路;而在TensorFl ...
  • 前段時間因業務需要完成了一個工作流組件的編碼工作。藉著這個機會跟大家分享一下整個創作過程,希望大家喜歡,組件暫且命名為"easyFlowable"。 接下來的文章我將從什麼是工作流、為什麼要自研這個工作流組件、架構設計三個維度跟大家來做個整體介紹。 ...
  • 1 簡介 我們之前使用了dapr的本地托管模式,但在生產中我們一般使用Kubernetes托管,本文介紹如何在GKE(GCP Kubernetes)安裝dapr。 相關文章: dapr本地托管的服務調用體驗與Java SDK的Spring Boot整合 dapr入門與本地托管模式嘗試 2 安裝GKE ...
  • 摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。 本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。 我們為什麼要對jvm做優化? 在本地開發環境中我們很少會遇到需要對jvm進行優化的需 ...
  • 背景 我們的業務共使用11台(阿裡雲)伺服器,使用SpringcloudAlibaba構建微服務集群,共計60個微服務,全部註冊在同一個Nacos集群 流量轉發路徑: nginx->spring-gateway->業務微服務 使用的版本如下: spring-boot.version:2.2.5.RE ...
  • 基於php+webuploader的大文件分片上傳,帶進度條,支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況)。文件上傳前先檢測該文件是否已上傳,如果已上傳提示“文件已存在”,如果未上傳則直接上傳。視頻上傳時會根據設定的參數(分片大小、分片數量)進行上傳,上傳過程中會在目標文件夾中生成一個臨 ...
  • 基於php大文件分片上傳至七牛雲,使用的是七牛雲js-sdk V2版本,引入js文件,配置簡單,可以暫停,暫停後支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況),可以配置分片大小和分片數量,官方文檔https://developer.qiniu.com/kodo/6889/javascrip ...