ASP.NET Core 的 `Core` 有幾種寫法?

来源:https://www.cnblogs.com/alby/archive/2019/03/28/aspnetcore-extension-points.html
-Advertisement-
Play Games

本文將會根據情況持續更新。 作為一個 `Framework`,`ASP.NET Core` 提供了諸多的擴展點。使用內置的組件和預設的配置通常就能夠滿足部分需求,當需要擴展的時就需要先去找出這些擴展點。除了基於實際應用對 `ASP.NET Core` 進行擴展,也會故意搞一些不切實際的偽需求,解決一... ...


一、概述

本文將會根據情況持續更新。
作為一個 FrameworkASP.NET Core 提供了諸多的擴展點。使用內置的組件和預設的配置通常就能夠滿足部分需求,當需要擴展的時就需要先去找出這些擴展點。除了基於實際應用對 ASP.NET Core 進行擴展,也會故意搞一些不切實際的偽需求,解決一些不會存在的問題。這樣的目的何在呢?一是為了加深對 ASP.NET Core 的理解,二是難保這些偽需求不會變成真需求。

二、WebHost.CreateDefaultHostBuilder

WebHost.CreateDefaultHostBuilder 靜態方法用於創建 WebHostBuilder 對象,它有三個重載:

public static IWebHostBuilder CreateDefaultBuilder();
public static IWebHostBuilder CreateDefaultBuilder(string[] args);
public static IWebHostBuilder CreateDefaultBuilder<TStartup>(string[] args) where TStartup : class;

ASP.NET Core 項目模板使用的是第二個重載。第一個重載其實沒多大必要,將第二個重載的 args 參數設置成預設為 null 也可以。使用第三個重載,可以少一次對 UseStartup<T> 的直接調用。

       public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
           WebHost.CreateDefaultBuilder<Startup>(args);

備註:CreateDefaultBuilder 不能滿足需求時,可自行通過 new 創建 WebHostBuilder 。比如 CreateDefaultBuilder 在創建 WebHostBuidler 調用了後者的 UseDefaultServiceProvider 擴展方法會導致使用預設的 DefaultServiceProviderFactory ,從而導致使用預設 DI 容器( ServiceProvider ),雖然之後可以替換成 Autofac 之類的,但可以控制直接使用而不是替換。

三、IWebHostBuilder.UseStartup

IWebHostBuilder.UseStartup 擴展方法用於使用 Startup,它有兩個重載:

public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, Type startupType);
public static IWebHostBuilder UseStartup<TStartup>(this IWebHostBuilder hostBuilder) where TStartup : class;

ASP.NET Core 項目模板使用的是第二個重載,即泛型版本。泛型版本內部實際上調用的是非泛型版本。如果 Startup 不是定義在 ASP.NET Core Web 項目而是另一個程式集中,可先通過反射獲取 Startup 的類型,然後調用非泛型版本。當然,通過反射來調用泛型版本也是可以的,但想不出這樣做的理由。

備註:
Startup 會被註冊為單例,多次調用 UseStartup 只有最後一個有效。
應用名稱預設是 Startup 類所在程式集的名稱,如果將 Startup 類放在另一個程式集中,需要留意這一點。

如果不使用 Startup 類,不註冊服務,只配置中間件的話,可以使用 IWebHostBuilder.Configure 擴展方法:

public static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder, Action<IApplicationBuilder> configureApp);

備註:Configure 看似是添加中間件的方法,其實不然。

四、使用第三方依賴註入

Startup 中替換依賴註入容器,以 Autofac 為例。第一種是實現 ConfigureContainer 方法:

       // ConfigureContainer is where you can register things directly
       // with Autofac. This runs after ConfigureServices so the things
       // here will override registrations made in ConfigureServices.
       // Don't build the container; that gets done for you. If you
       // need a reference to the container, you need to use the
       // "Without ConfigureContainer" mechanism shown later.
       public void ConfigureContainer(ContainerBuilder builder)
       {
           builder.RegisterModule(new AutofacModule());
       }

第二種是實現 ConfigureServices 方法:

       // ConfigureServices is where you register dependencies. This gets
       // called by the runtime before the Configure method, below.
       public IServiceProvider ConfigureServices(IServiceCollection services)
       {
           // Add services to the collection.
           services.AddMvc();
           // Create the container builder.
           var builder = new ContainerBuilder();
           // Register dependencies, populate the services from
           // the collection, and build the container.
           //
           // Note that Populate is basically a foreach to add things
           // into Autofac that are in the collection. If you register
           // things in Autofac BEFORE Populate then the stuff in the
           // ServiceCollection can override those things; if you register
           // AFTER Populate those registrations can override things
           // in the ServiceCollection. Mix and match as needed.
           builder.Populate(services);
           builder.RegisterType<MyType>().As<IMyType>();
           this.ApplicationContainer = builder.Build();
           // Create the IServiceProvider based on the container.
           return new AutofacServiceProvider(this.ApplicationContainer);
       }

第三種方法是採用自定義 IServiceProviderFactory 的方式,比如 Abp

  public static class AbpAutofacAbpApplicationCreationOptionsExtensions
  {
   public static void UseAutofac(this AbpApplicationCreationOptions options)
   {
     ContainerBuilder builder = new ContainerBuilder();
     options.Services.AddObjectAccessor<ContainerBuilder>(builder);
     options.Services.AddSingleton<IServiceProviderFactory<ContainerBuilder>>((IServiceProviderFactory<ContainerBuilder>) new AbpAutofacServiceProviderFactory(builder));
   }
  }

備註:對於第三種方法,不用陷入先有雞還是先有蛋的困境,WebHostBuilderBuild 方法會創建一個 HostingServiceProvider

五、服務註冊點

包含名為 ConfigureServices 或類似的方法的介面和類:

類/介面 程式集 命名空間 備註
IStartup Microsoft.AspNetCore.Hosting.Abstractions Microsoft.AspNetCore.Hosting 介面。 實現類定義於應用。 配合 IWebHostBuilder.UseStartup 方法。
Startup 自定義 自定義 定義於應用。不繼承任何介面或類,實現 Configure 和 ConfigureServices 等方法。 配合 IWebHostBuilder.UseStartup 方法。
IWebHostBuilder Microsoft.AspNetCore.Hosting.Abstractions Microsoft.AspNetCore.Hosting 介面。
WebHostBuilder : IWebHostBuilder Microsoft.AspNetCore.Hosting Microsoft.AspNetCore.Hosting ConfigureServices 不會進行實際的服務註冊操作,當調用 Build 方法時才註冊。

六、中間件註冊點

包含名為 Configure 或類似方法的介面和類:

類/介面 程式集 命名空間 備註
IStartup Microsoft.AspNetCore.Hosting.Abstractions Microsoft.AspNetCore.Hosting 介面。實現類定義於應用。 配合 IWebHostBuilder.UseStartup 方法。
IHostingStartup Microsoft.AspNetCore.Hosting.Abstractions Microsoft.AspNetCore.Hosting 介面。
Startup 自定義 自定義 定義於應用。不繼承任何介面或類,實現 Configure 和 ConfigureServices 等方法。 配合 IWebHostBuilder.UseStartup 方法。
IStartupFilter Microsoft.AspNetCore.Hosting.Abstractions Microsoft.AspNetCore.Hosting 介面。實現類定義於應用。需註冊為服務。

參考資料

ASP.NET Core 中的應用啟動
在 ASP.NET Core 中使用 IHostingStartup 從外部程式集增強應用
Autofac 集成 ASP.NET Core
Abp 依賴註入
ASP.NET Core 的擴展點


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

-Advertisement-
Play Games
更多相關文章
  • 給定兩個以字元串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字元串形式。 示例 1:輸入: num1 = "2", num2 = "3"輸出: "6"示例 2:輸入: num1 = "123", num2 = "456"輸出: "56088"說 ...
  • 未完待續,預計3.31完成 摘要:java引入註解後,編碼節省了很多需要寫代碼的時間,而且精簡了代碼,本文主要羅列項目中常用註解。 1 事務相關 @Transactional 事務回滾,作用於資料庫操作時,當操作數據失敗,該操作可以還原 ...
  • 指針、引用和取值 什麼是指針?什麼是記憶體地址?什麼叫做指針的取值?指針是一個存儲電腦記憶體地址的變數。在這份教程里“引用”表示電腦記憶體地址。從指針指向的記憶體讀取數據稱作指針的取值。指針可以指向某些具體類型的變數地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始 ...
  • Git使用教程 一:Git是什麼? Git是目前世界上最先進的分散式版本控制系統。 二:SVN與Git的最主要的區別? SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央 ...
  • 1. 架構設計(二) 1.1. 分散式事務設計與實踐 1.1.1. 數據一致性定義 1.1.2. 數據不一致原因 1.1.3. 剛性分散式事務 1.1.3.1. XA模型 1.1.3.2. 2PC模型 1. 不適合長事務 1.1.4. 柔性分散式事務 1.1.4.1. TCC模型 1.1.4.2. ...
  • 這種題目第一眼看上去賊簡單,作為一道面試題可能一不小心就入坑了~ 我想大部分人第一眼看上去可能會想著 交換a,b的值。 實際上是不可行的,畢竟java的值傳遞並不會真正的改變a,b的值,所以無論怎麼在change方法中修改,main方法中始終列印a=10,b=20; 所以呢,真實答案請參考以下代碼~ ...
  • VS項目Debug|Release包含排除不同技巧,csproj技巧 ...
  • 之前花了很長的一段時間研究之後,以便把(第三方或)系統的和應用的dll分開,最後還寫了一篇文章介紹,木有想到,今天又入坑了,發現了一個bug。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...