可以只读的 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.mzph.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,点击下一步。

《看聊天记录都学不会C语言?太菜了吧》(20)(必懂!题解)我能知道2000年后的这个月一共有几天

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

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

众所周知nginx使用异步&#xff0c;事件驱动方法处理连接。这意味着nginx使用一个worker进程处理多个连接和请求&#xff0c;而不是每一个请求有一个专门的进程或着线程处理(像传统架构的服务器那样&#xff0c;例如apache)。为了实现这个目的&#xff0c;nginx使用非阻塞模式的…

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…

一维条形码***技术(Badbarcode)

【转】http://future-sec.com/badbarcode.html 前言在日常生活中&#xff0c;条形码随处可见&#xff0c;特别在超市&#xff0c;便利店&#xff0c;物流业&#xff0c;但你们扫的条形码真的安全吗&#xff1f;之前TK教主在PacSec介绍的条形码攻击和twitter上的demo视频太炫酷&…

ArcGIS 10.7 模型构建器Model Builder空间建模流程化作业案例----影像拼接与掩膜裁剪

Model Builder(模型构建器)是一个用来创建、编辑和管理空间分析模型的应用程序,是一种可视化的编程环境,通过对现有工具的组合完成新模型或软件的制作,为设计和实现空间处理模型(包括工具、脚本和数据)提供了一个图形化的模型框架。 本文以影像数据的拼接和掩膜裁剪为例…

Hello Playwright:(4)自动化测试

利用 Playwright 提供的 API&#xff0c;我们在浏览器上做的很多事情都可以自动化。例如&#xff0c;搜索数据、填写表单和下载文件等等。但最适合的工作&#xff0c;就是自动化测试 Web 应用程序。自动化测试测试是软件开发中的一项基本任务&#xff0c;至少&#xff0c;你需要…

ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法

GIS中经常会出现多部件要素的现象,为了便于检查拓扑等关系,需要将其拆分为单个的部件。例如,在用同一个图层的多个图斑去裁剪(Clip)时,或者将多个不相邻的图斑进行合并(merge)时,可能会产生多部件要素,本文演示ArcGIS10.7版本中常见的两种拆分多部件要素至单部件要素…

spring-session + redis 实现集群 session 共享

2019独角兽企业重金招聘Python工程师标准>>> 目前市面上实现session共享的方案有很多&#xff0c;其中比较常用的是使用Tomcat、Jetty等web服务器提供的session共享功能&#xff0c;以此将session内容统一存放在数据库&#xff08;如mysql&#xff09;或者缓存&…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

业务流水号规则生成组件

对于很多业务系统都需要生成业务流水号&#xff0c;如果订单号、购采单号等等&#xff1b;而这些业务流水号并不是简单的一个增长数值&#xff0c;它们很多时候都有一些不同的规则来定义&#xff0c;如不同类型的字母或地区拼音简写等。为了更灵活生成这些有规则的业务流水号Be…

ArcGIS中国工具(ArcGISCTools)3.2 安装教程(附安装包下载)

ArcGIS中国工具,简称CTools,集成在ArcGIS 10.x系列版本中。本文在ArcGIS10.7的基础之上,演示3.2版本安装过程,并提供下载地址共大家学习和交流。 一、安装过程

阿里云ECS,搭建MySQL5.7数据库环境

为什么80%的码农都做不了架构师&#xff1f;>>> 配置mysql yum源 [rootiZbp1j6oiamq7t2otpryarZ ~]# cd /data/ [rootiZbp1j6oiamq7t2otpryarZ data]# ll total 0###################################下载mysql源安装包# [rootiZbp1j6oiamq7t2otpryarZ data]# wge…