定制.NET 6.0的依賴注入

本章是《定制ASP NET 6.0框架系列文章》的第三篇。在本章,我們將學習ASP.NET Core的依賴項注入(DI)以及如何自定義它。
我們將討論以下主題:

  • 使用不同的DI容器

  • 探索ConfigureServices方法

  • 使用其他的ServiceProvider

  • Scrutor簡介

技術準備

我們使用以下命令(你可以在console, shell,Bash終端),創建一個MVC應用:

dotnet new mvc -n DiSample -o DiSample

在Visual Studio中打開項目,或在控制臺中鍵入以下命令,在Visual Studio Code中打開項目:

cd DiSample
code .

使用不同的DI容器

在大多數項目中,我們其實不需要使用不同的DI容器。ASP.NET Core中的現有DI基本上滿足我們的需要。但是,你可能喜歡其他DI容器的其他功能:

  • 使用Ninject創建一個支持模塊作為輕量級依賴項的應用程序。比如,您可能希望將模塊放入特定目錄中,并在應用程序中自動注冊這些模塊。

  • 在應用程序外部的配置文件中,比如,在XML或JSON文件中,而不是僅在C#中配置服務。這是各種DI容器中的常見功能,但ASP.NET Core中尚不支持。

  • 在運行時添加服務,獲取動態的DI容器,這也是一些DI容器中的常見特性。

現在,讓我們看看ConfigureServices方法是如何操作的。

探索ConfigureServices方法

我們將當前的ConfigureServices方法與以前的長期支持版本(TLS)進行比較,看看有什么變化。如果您使用版本3.1創建的ASP.NET Core項目,并打開Startup.cs文件,配置服務的方法如下所示:

public void ConfigureServices(IServiceCollection services)
{services.Configure<CookiePolicyOptions>(options =>{options.CheckConsentNeeded = context => true;});services.AddControllersWithViews();services.AddRazorPages();
}

相反,在?ASP.NET Core 6.0,沒有啟動Startup.cs,服務的配置在Startup.cs中進行,如下所示:

var?builder?=?WebApplication.CreateBuilder(args); 
//?Add?services?to?the?container. builder.Services.AddControllersWithViews(); 
var?app?=?builder.Build(); 
// The rest of the file isn't relevant for this chapter

這兩種情況都可以獲得IServiceCollection,其中默認已經填充了ASP.NET Core所需的一組服務,比如宿主服務、ConfigureServices方法之前執行的相關服務。
以上方法中,添加了更多的服務。

  • 首先,將包含cookie策略選項的配置類添加到ServiceCollection

  • AddMvc()方法添加MVC框架所需的服務。
    到目前為止,我們有大約140個服務注冊到IServiceCollection
    但是,服務集合不是實際的DI容器,真實的DI容器被包裝在所謂的服務提供者中(ServiceProvider)。

那么應該如何獲取DI容器呢?

IServiceCollection有了一個擴展方法,它用于從服務集合中創建IServiceProvider,代碼如下:

IServiceProvider provider = services.BuildServiceProvider()

ServiceProvider包含不可變容器,即在運行時無法更改。在ConfigureServices方法執行后,會在后臺創建IServiceProvider
接下來,我們再看下如何在DI定制過程中,替代IServiceProvider

使用其他IServiceProvider

如果其他容器已經支持ASP.NET Core,則更改為其他或自定義DI容器將變得非常容易。通常,第三方DI容器會使用IServiceCollection做為自己的容器,它通過循環集合將已注冊的服務移動到另一個容器。
我們用第三方容器Autofac舉個例子。在命令行中鍵入以下命令,加載NuGet包:

dotnet add package Autofac.Extensions.DependencyInjection

要注冊自定義IoC容器,通常需要注冊不同的IServiceProviderFactoryIServiceProviderFactory將創建一個ServiceProvider實例。如果第三方容器支持ASP.NET Core,則必須提供一個該工廠類。如果你要使用Autofac,則需要使用AutofacServiceProviderFactory

我們在Program.cs中給IHostBuilder編寫一個擴展方法,內部注冊一個AutofacServiceProviderFactory

using Autofac; 
using Autofac.Extensions.DependencyInjection; 
namespace DiSample; public static class IHostBuilderExtension { ????    public static IHostBuilder?UseAutofacServiceProviderFactory(this IHostBuilder hostbuilder) { ????????hostbuilder.UseServiceProviderFactory (new AutofacServiceProviderFactory()); ????????        return hostbuilder; ????}
}

注意,不要忘記將引入名稱空間:AutofacAutofac.Extensions.DependencyInjection
要使用此擴展方法,可以在Program.cs中使用AutofacServiceProvider

var builder = WebApplication.CreateBuilder(args); 
builder.Host.UseAutofacServiceProviderFactory(); 
// Add services to the container. builder.Services.AddControllersWithViews();

以上通過擴展方法將AutofacServiceProviderFactory添加到IHostBuilder中,并啟用AutofacIoC容器。后續會轉而使用AutofacIServiceCollection添加服務。
再強調一下,除非必要。通常,我們不一定要替換現有的.NET CoreDI容器。

Scrutor簡介

在本章的開頭,我提到了服務的自動注冊,這里可以通過其他DI容器完成。這里介紹一個名為Scrutor的不錯的NuGet包來實現。
Scrutor通過向.NET Core?DI容器向IServiceCollection添加一個擴展方法,用以自動注冊服務。

擴展閱讀
這里介紹一篇關于Scrutor的非常詳細的博客文章,建議您繼續閱讀這篇文章以了解更多信息。

回顧

通過以上演示,我們將能夠使用任何.NET標準兼容的DI容器替換現有容器。如果您選擇的容器不包括ServiceProvider,請自己實現一個IServiceProvider接口,并在其中使用DI容器。如果您選擇的容器沒有提供填充服務的方法,請自行創建自己的方法。循環已注冊的服務并將其添加到另一個容器中。
最后一步聽起來很簡單,實現起來比較費勁,因為需要將所有的IServiceCollection注冊轉換為其他容器的注冊,它的復雜性取決于其他DI容器的實現細節。
任何時候,我們都可以選擇使用任何與.NET標準兼容的DI容器,替換ASP.NET Core中的許多默認實現。
在下一章我們將探討如何以不同的方式配置HTTPS,感謝您的閱讀。

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

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

相關文章

50 個 Redis 必備知識:基礎知識,架構、調優和監控知識及難點解決

本文包括&#xff1a;30 個 Redis 基礎知識&#xff1b;10個 Redis 架構和運維必懂的知識&#xff1b;Redis 調優、監控知識和10個具體應用難點。 本篇文檔已整理成pdf文檔&#xff0c;需要的同學文末自取 30 個 Redis 基礎知識 1、Redis支持哪幾種數據類型&#xff1f; Str…

【ArcGIS微課1000例】0043:ArcGIS繪制國界線的3種方法

本文講解ArcGIS繪制國界線的3種方法。 文章目錄 1. 直接修改國界線符號2. 緩沖區工具3. 制圖表達1. 直接修改國界線符號 直接修改國界線/省界線的符號。點擊“線要素”出現符號選擇器,點擊【編輯符號】按鈕,編輯成下面右圖的形式。缺點:只能在邊界一側出現緩沖樣式,如下面…

javascript雜記

菜鳥教程   http://www.runoob.com/js/js-tutorial.html 響應鍵盤事件  https://www.cnblogs.com/shihaiming/p/6210655.html 窗口變化  http://www.jb51.net/article/124581.htm div定位1  http://www.divcss5.com/shili/s587.shtml   div定位2  https://www.cnbl…

沒有暑假的Ada 要好好努力咯 C#繼續

嗷嗷嗷啊啊啊啊啊轉載于:https://www.cnblogs.com/AdaLoong/p/5645720.html

C# 獲取系統已安裝的.NET版本

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清原文地址&#xff1a; https://www.cnblogs.com/kybs0/p/16478587.htmlC# 獲取系統已安裝的.NET版本獲取系統已安裝的.NET版本&#xff0c;來確定當前應用可運行的環境。獲取系…

.NET 6 Minimal API 的經驗分享

Minimal API 是 .NET 6 提供的最新功能 &#xff0c; 對比傳統的 ASP.NET Core Web API 方式更加直接 , 你可以用幾行代碼編寫好 REST API 。 沒有了祖傳的 Startup.cs 和 Controller &#xff0c;通過簡單的代碼就可以完成 API 的開發。在第二階段的 .NET 挑戰賽中就以 .NET 6…

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. 繪制形狀符號…