可以只讀的 ServiceCollection

可以只讀的 ServiceCollection

Intro

在 .NET 7 Preview 4 中,ServiceCollection 可以聲明為只讀了,這使得我們可以有效避免在構建了 ServiceProvider 之后再新增服務,導致服務注冊失敗。

Sample

在新的版本中,ServiceCollection 新增了一個 MakeReadonly() 的 API,調用之后,ServiceCollection 就不能再修改了,不能再注冊新的服務或者移除集合中的服務,再修改就會拋異常。

直接來看一個示例吧,示例代碼如下:

var?services?=?new?ServiceCollection();
services.AddSingleton<IUserIdProvider,?EnvironmentUserIdProvider>();
await?using?(var?provider?=?services.BuildServiceProvider())
{Console.WriteLine(provider.GetRequiredService<IUserIdProvider>().GetHashCode());
}Console.WriteLine(services.IsReadOnly);services.MakeReadOnly();Console.WriteLine(services.IsReadOnly);try
{services.AddSingleton<IHttpRequester,?HttpClientHttpRequester>();
}
catch?(Exception?ex)
{Console.WriteLine(ex);
}

輸出結果如下:

43942917
False
True
System.InvalidOperationException:?The?service?collection?cannot?be?modified?because?it?is?read-only.at?Microsoft.Extensions.DependencyInjection.ServiceCollection.ThrowReadOnlyException()at?Microsoft.Extensions.DependencyInjection.ServiceCollection.CheckReadOnly()at?Microsoft.Extensions.DependencyInjection.ServiceCollection.System.Collections.Generic.ICollection<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>.Add(ServiceDescriptor?item)at?Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.Add(IServiceCollection?collection,?Type?serviceType,?Type?implementationType,?ServiceLifetime?lifetime)at?Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(IServiceCollection?services,?Type?serviceType,?Type?implementationType)at?Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton[TService,TImplementation](IServiceCollection?services)at?Net7Sample.ServiceCollectionSample.MainTest()?in?C:\projects\sources\SamplesInPractice\net7Sample\Net7Sample\ServiceCollectionSample.cs:line?28

ec03a502237d0c7c563828c2e7926971.png

More

在新的 HostApplicationBuilder 中也借助了這個 API ,在構建 Host 的時候也會調用這個 API 來使得 ServiceCollection 中注冊的服務不能再變更,可以參考:https://github.com/dotnet/runtime/pull/68051/files#diff-e55c31d683c37cca99b7a3a274beef4a3101d53b02c9ea989e4f6310094f68ec

在我們的應用中遇到想要使 ServiceCollection 不能再修改的時候就可以考慮使用這個 API 來避免誤操作從而導致意外的 BUG

References

  • https://github.com/dotnet/runtime/pull/68051

  • https://github.com/dotnet/runtime/pull/68051/files#diff-e55c31d683c37cca99b7a3a274beef4a3101d53b02c9ea989e4f6310094f68ec

  • https://github.com/dotnet/runtime/issues/66126

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net7Sample/Net7Sample/ServiceCollectionSample.cs

  • .NET 7 中的 HostApplicationBuilder

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

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

相關文章

阿里云與中國聯通首個公共云平臺上線

11月8日&#xff0c;阿里云與中國聯通關于公共云合作的首個項目&#xff1a;浙江聯通“沃云Powered by Alibaba cloud” 平臺&#xff08;cloud.10010zj.com.cn&#xff09;正式發布上線。該平臺將以沃云品牌為客戶提供“阿里云聯通”服務&#xff0c;結合阿里云技術及浙江聯通…

IBM X System ServerGuide 8.41 服務器 系統安裝 引導盤

IBM X System ServerGuide 8.41 支持操作系統: 32位: Microsoft Windows 2003/2003 R2 (Enterprise, Standard, Web and DataCenter UV) Microsoft Small Business Server 2003/2003 R2 (Standard/Premium Edition) Microsoft Windows 2008 (Enterprise, Standard, Web and Dat…

Matlab R2018b簡體中文版完整安裝圖文教程(附安裝包下載)

目 錄 一、安裝過程 二、下載地址 matlab R2018b安裝包如下所示,包括主程序和補丁文件兩部分。 一、安裝過程 雙擊安裝包中的setup.exe。 選擇使用文件安裝MIYAO,點擊下一步。

Android之解決Android10.0通過熱點名字和密碼連接指定熱點網絡不能通信問題(2種解決辦法)

1 問題 Android10.0設備通過熱點名字和密碼連接另外一臺設置指定熱點,但是他們之間依然不能通信,網絡不可達。 Android10.0設備通過熱點名字和密碼連接另外一臺設置指定熱點,我用的是官方API,可以參考我的這篇博客 Android之通過用戶名和密碼連接指定wifi熱點(兼容Android…

《看聊天記錄都學不會C語言?太菜了吧》(20)(必懂!題解)我能知道2000年后的這個月一共有幾天

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

linux nginx線程池,nginx使用線程池提升9倍性能

眾所周知nginx使用異步&#xff0c;事件驅動方法處理連接。這意味著nginx使用一個worker進程處理多個連接和請求&#xff0c;而不是每一個請求有一個專門的進程或著線程處理(像傳統架構的服務器那樣&#xff0c;例如apache)。為了實現這個目的&#xff0c;nginx使用非阻塞模式的…

android 開源項目

https://github.com/Trinea/android-open-project http://a.codekk.com/轉載于:https://www.cnblogs.com/syjhsgcc/p/4902885.html

【空間數據庫】ArcSDE 10.7+SQLEXPRESS+ArcServer 10.7.ecp企業級數據庫環境搭建

作者一直使用的是ArcGIS10.6做空間數據庫相關工作,可以參照文章《ArcGIS 10.6 Database_Server_Desktop安裝、連接數據庫服務、創建企業級數據庫》。今天我們演示安裝ArcGIS10.7自帶的數據庫服務(SQL Server 2014 Express版本)、連接數據庫服務和創建數據庫。 一、軟件準備 …

Android之解決androidx.appcompat.widget.Toolbar去掉左邊距

1 問題 androidx.appcompat.widget.Toolbar默認左邊有間距 2 解決辦法 在Toolbar下面添加如下熟悉 app:contentInsetLeft"0dp"app:contentInsetStart"0dp"app:contentInsetEnd"0dp"app:maxButtonHeight"20dp"app:titleMargin"0…

C# 配置日志記錄

在 .NET Core 中&#xff0c;可以給配置文件使用提供程序&#xff0c;例如從 JSON 或 XML文件、環境變量或命令行參數中讀取配置。只需要從 NuGet 包 Microsoft.ExtensionsConfiguration 中創建一個ConfigurationBuilder&#xff0c;并向此構建器添加提供程序。要添加 JSON 提供…

使用“using” 的 “Cursor”

很多時候&#xff0c;我們會寫下面的這段代碼&#xff1a; private void button1_Click(object sender, EventArgs e) {Cursor cursor Cursor.Current;this.Cursor Cursors.WaitCursor;LongTimeMethod();this.Cursor cursor; }private void LongTimeMethod() {for (int i 0…

《看聊天記錄都學不會C語言?太菜了吧》(21)(必懂!題解)在現實生活中,打擂臺比賽爭名次竟用的是冒泡排序?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

ArcGIS 10.7如何獲取矢量多邊形所有折點的坐標(平面坐標和經緯度坐標)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分類算法學習之實現Naive Bayes分類示例

1.簡介 (1) 貝葉斯分類器的分類原理發源于古典概率理論&#xff0c;是通過某對象的先驗概率&#xff0c;利用貝葉斯公式計算出其后驗概率&#xff0c;即該對象屬于某一類的概率&#xff0c;選擇具有最大后驗概率的類作為該對象所屬的類。樸素貝葉斯分類器(Naive Bayes Classifi…

linux重新做yum,Linux 系統 Centos 7.7 下重裝yum

0. 背景不小心誤刪除yum后&#xff0c;開始想辦法重新安裝。1. 重裝 yum1.1 步驟需要下面4個包&#xff0c;我們需要下載到它們yum-metadata-parserpython-iniparseyum-plugin-fastestmirroryum-3.4.3下載后&#xff0c;安裝它們。1.2 去哪里下載&#xff1f;當然&#xff0c;搜…

jenkins2 groovy語法

文章來自&#xff1a;http://www.ciandcd.com文中的代碼來自可以從github下載&#xff1a; https://github.com/ciandcd安裝&#xff1a;wget https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.7.zipunzip apache-groovy-binary-2.4.7.zipsudo ln -s /home/osbox…

Android之glide加載圖片圓角效果

1 問題 Android加載圖片需要圓角化,有什么簡單粗暴的方法嗎?當然有,用我們的神器glide 2 解決辦法 1)簡單辦法 ImageView imageView = (ImageView)helper.getView(R.id.keepHomeAppImageview);Glide.with(mContext).asBitmap().load(iconUrl) // .ov…

一維條形碼***技術(Badbarcode)

【轉】http://future-sec.com/badbarcode.html 前言在日常生活中&#xff0c;條形碼隨處可見&#xff0c;特別在超市&#xff0c;便利店&#xff0c;物流業&#xff0c;但你們掃的條形碼真的安全嗎&#xff1f;之前TK教主在PacSec介紹的條形碼攻擊和twitter上的demo視頻太炫酷&…

ArcGIS 10.7 模型構建器Model Builder空間建模流程化作業案例----影像拼接與掩膜裁剪

Model Builder(模型構建器)是一個用來創建、編輯和管理空間分析模型的應用程序,是一種可視化的編程環境,通過對現有工具的組合完成新模型或軟件的制作,為設計和實現空間處理模型(包括工具、腳本和數據)提供了一個圖形化的模型框架。 本文以影像數據的拼接和掩膜裁剪為例…

《看聊天記錄都學不會C語言?太菜了吧》(22)(必懂!題解 1-100 內素數)素數原來是質數!為什么你不早說!

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…