日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core 3.1通用主机原理及使用

發布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core 3.1通用主机原理及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

只是講asp.net core 3.x通用主機的大致原理,這些東西是通過查看源碼以及自己根據經驗總結得來的,在文章中不會深入源碼,因為個人覺得懂原理就曉得擴展點,后期碰到有需求的時候再仔細去研究源碼也不遲。
閱讀前你應該先去了解下(推薦博客園老A的博客):

  • asp.net core中的依賴注入、

  • 配置,

講解的方式是:

  • 概述

  • 逐一介紹核心類及擴展方式

  • 通常我們如何使用

  • 總結

  • 二、概述

    以前的控制臺應用程序、winform程序啟動時main首先被執行,后續都是我們自己的代碼來實現框架和業務上的東東,比如我們要使用配置就ConfigurationManager.AppSettings... 若想使用依賴注入則需要引入第三方框架,比如autofact。asp.net framework時代也類似

    在.net core 3.0之前的版本默認使用的是IWebHost,它內部定義了IOC容器(服務注冊體現在Startup.ConfigServices),和各種配置源的設置(體現在Program配置主機時),我們后續的Controler、View、包括業務代碼可以很容易做依賴注入和獲取配置信息(包括運用選項模式)

    有時候我們希望寫一個服務,但是這個服務并不是用來做api/web,處理http請求的,比如想做一個物聯網的后端采集服務,一直等待遠端硬件設備提交實時數據過來,后端進行處理。但是又希望使用asp.net core提供的 配置、依賴注入、日志 和其它功能。后來微軟就將asp.net core中的這套東西抽離出來了,叫做通用主機,用來承載任何服務,這些自定義服務中就可以很方便地使用配置、依賴注入、日志、和其它功能。現在asp.net core只是由通用主機承載的其中一種服務。

    2.1、默認情況下主要的實現思路是:

    2.1.1、定義(微軟定義好的):

    • 定義HOST,它包含IOC根容器、主機和應用程序的生命周期事件定定義、IHostedService集合(一個實例就是一個服務或者叫應用,asp.net core就是一個這樣的實例)

    • 允許調用方提供一堆委托來向IOC中注冊服務、和設置主機和應用的“配置源”

    • 提供向主機添加IHostedService的實現對象的方法

    • 允許調用方注冊主機和應用在啟動和停止階段觸發的相應事件

    2.1.2、配置(我們的代碼,微軟定義很多輔助方法):

    • 創建IHost實例

    • 向Host的IOC容器中注冊各種服務

    • 配置主機和應用程序的“配置源

    • 向主機內部添加IHostedService實例(也就是我們最終的服務)

    • 主機和應用的生命周期事件,來實現一些特殊任務

    2.1.3、啟動階段(微軟定義好的)

    • 上面所謂的配置基本都是通過委托實現的(通常微軟提供的各種擴展方法最終也是執行委托),回調這些委托以設置“配置源”和注冊服務

    • 最后遍歷啟動HostedService

    • 在啟動過程中還會回調相應的生命周期事件

    2.2、啥是應用?

    上面提了幾次“應用”,現在對于主機來說asp.net core框架就是一個應用、我們上面舉例說的"物聯網后端服務"是另一個應用。從代碼上來說就是一個IHostedService的實現。
    主機和應用是一對多的關系,多個應用可以共享主機的信息,如:主機的IOC容器、主機的配置。應用配置。應用當然也可以自己去創建自己的IOC根容器和配置對象

    主機配置和應用配置有關系?這兩個配置對象都存在于Host中,主機配置是只跟主機相關的配置,應用配置是主機中多個應用共享的配置,如果主機中只有一個應用,那么完全可以拿它做最終的應用配置。另外應用配置包含主機配置

    注意:在理解時要記住我們現在的目的是講解通用主機,意思是可以承載你自己定義的服務的主機,別去想什么mvc controller action 路由之類的

    三、核心類

    下面分別介紹下主機中的幾個核心默認實現類,幾乎每個類都有對應的接口,為了縮短篇幅、便于理解就不講接口了。

    3.1、Host

    它代表主機,用來宿主(承載)我們應用(一個IHostedService的實現)。
    主要包含:日志、主機和應用的生命周期事件、IOC根容器、主機的選項對象、啟動停止/停止方法。
    接口中只定義了:IOC根容器 + Start + Stop方法
    它在Program.Main中被創建、配置和啟動

    默認實現Microsoft.Extensions.Hosting.Internal.Host,它是一個internal的類,這個主機將來被啟動時:

    • 觸發主機的WaitForStartAsync事件

    • 逐一啟動主機內部的hostedService

    • 觸發_applicationLifetime?.NotifyStarted();事件

    • 停止時就反過來,先逐一停止hostedService,觸發響應事件、最后停止主機

    擴展:

    因為默認Host是internal修飾的,所以無法繼承

    • 自定義實現IHost;(這不說了,你可以隨心所欲)

    • 訂閱主機和應用的生命周期事件(實現IHostLifetime、IHostApplicationLifetime并添加到IOC容器)

    大部分情況下方式2實現起來更容易也更常見

    提一嘴,asp.net core 3.x現在也是使用的這個默認主機,只是在上面做了根web相關的配置,將在下一篇講解

    3.2、HostBuilder

    Host的職責只是完成主機該有的功能,那么它的創建及配置最好另外定義一個類HostBuilder,它是Host的創建器(工廠),我們通常

    • 在系統啟動時(Program.Man)先創建HostBuilder,

    • 然后進行配置(向IOC容器注冊服務,設置主機和應用的"配置源"),

    • 最后調用Build方法生成我們最終的Host

    通過接口IHostBuilder源碼可以初略看出它(通過委托的方式)提供以下功能

    • 設置主機和應用的“配置源”

    • 配置IOC容器本身

    • 想IOC容器添加服務

    • 創建Host

    • 有個Properties屬性,是個字典類型,可以在構建Host的多個步驟中傳遞數據

    擴展:

    對于我們使用者來說主要是通過它的方法向內部塞入各種委托,以達到向IOC容器注冊服務和設置主機和應用的“配置源”
    也可以但估計很少去實現主機的IHostBuilder;繼承HostBuilder意義也不大,因為它沒有提供抽象和虛方法

    默認Build流程
    初始化主機配置對象IConfiguration,主要是回調,主機沒有做其它的
    初始化主機環境對象_hostingEnvironment

    • 應用程序名字從上一步的主機配置里來

    • 環境名(開發?調試?)從配置里來,若沒有則默認是生產模式"Production"

    • 內容根也從配置里來,若沒有則是當前程序路徑

    • 根據內容跟創建一個ContentRootFileProvider 實現類是PhysicalFileProvider

    初始化HostBuilderContext,根據上面的配置和環境創建這個上下文(這里只是暫時用的主機配置,下面會被替換成應用的配置)
    初始化應用配置

    • 以上面的內容根作為配置查找的根(若將來提供物理文件作為配置源時需要此屬性)

    • 將主機配置塞入這個應用配置,所以應用配置=主機配置+回調后的配置

    • 最后將HostBuilderContext的Configuration替換為此配置對象

    創建IOC容器

    • 創建ServiceCollection,并將上面的幾個對象以單利模式放入進去

    • 還要放入IHostApplicationLifetime和IHostLifetime和Host

    • 開啟選項模式,注冊日志

    • 回調configureServicesAction

    • 調用工廠_serviceProviderFactory創建ServiceProvider

    • 回調_configureContainerActions

    • 最后返回容器

    調用容器解析并返回Host

    3.3、HostBuilder的工廠方法Host.CreateDefaultBuilder

    上面有了Host,也有了對應的創建器HostBuilder,為啥還要再提供一個工廠方法呢?
    因為職責分離原則,Host只負責承載應用并提供容器和設置配置源;HostBuilder只是負責配置并創建Host,盡可能提供一些默認值(前提時將來調用方未提供那些參數)。此時我們可以直接用HostBuilder來創建Host并啟動它,但別忘了.net core是一個通用框架,它應提供一個更簡潔的方式來創建最終的Host,因此它提供了靜態方法Host.CreateDefaultBuilder,它盡可能提供更多的默認值,核心任務如下:

    • new HostBuilder

    • 設置程序的當前目錄為內容根

    • 為主機配置 設置 環境變量作為配置源(只關注前綴DOTNET_的環境變量)

    • 為應用配置設置 以“appsettings.json”和“appsettings.{env.EnvironmentName}.json”作為配置源;同時也將環境變量加入到應用的配置源;最后將命令行參數加入到配置源

    • 配置日志

    • 若是開發模式,還會配置依賴注入的范圍驗證

    四、從使用者的角度來說

    通過自定義實現IHostedService的類來實現我們的服務,我們的服務中的類可以

    • 直接使用依賴注入,

    • 也可以通過依賴注入獲取主機配置和全局應用配置對象,或者更方便的是進一步使用選項模式

    • 我們也可以注入日志記錄器

    • 由于主機創建過程的相關數據幾乎都放進了IOC容器中,因此我們也可以通過依賴注入拿到

    • 其它...

    在Program.man調用Host.CreateDefaultBuilder,如果需要,提供相應的委托來注冊服務和設置主機和應用的“配置源”,最好是通過相關擴展方法和自定義擴展方法。重點是記得注入我們自己的服務實現類

    五、總結

    .net core為我們提供了新的承載應用(包括但不僅限于asp.net core)的方式-->通用主機,通過它我們可以很容易的在自己的應用中使用依賴注入、配置、日志等,你可以發揮想象實現很多牛B的框架。
    asp.net core 3.x開始默認也是使用它來承載的
    核心的Host、HostBuilder、Host.CreateDefaultBuilder實現了通用主機,并提供了擴展點

    最后我想說如果在.net core上提供一個默認的aop方案就更完美了。
    下一篇試試說下asp.net?core是如何承載到通用主機上的

    總結

    以上是生活随笔為你收集整理的.NET Core 3.1通用主机原理及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。