内置IOC容器ServiceCollection

.NetCore内置IOC容器ServiceCollection

一、IOC介绍

IOC:全名(Inversion of Control)-控制反转

IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们可以直接从这个外部容器中去拿,而再也不需要我们去new了,充分体现了DIP(依赖倒置原则),也体现了我们经常挂在嘴边的面向接口编程。

DI:全名(Dependency Injection)-依赖注入

DI意味着将类型之间的依赖关系注入到DI容器中

在之前的.Net Framework中并没有集成IOC,虽然Microsoft自己有一套"Unity",想要使用IOC+DI时,还需要我们自己去安装包,进行三部曲等等各种操作

比较流行的IOC容器技术:Autofac、Unity、NInject。。。

二、.NetCore内置IOC容器ServiceCollection

1、打开NuGet包管理器,安装 Microsoft.Extensions.DependencyInjection 包

2、实现代码如下:

public interface ISqlHelper
{void GetAll();
}
public class SqlServerHelper : ISqlHelper
{public void GetAll(){Console.WriteLine("this is "+typeof(SqlServerHelper));}
}
static void Main(string[] args)
{ServiceCollection services = new ServiceCollection();services.AddTransient<ISqlHelper, SqlServerHelper>();var provider=services.BuildServiceProvider();var sqlHelper=provider.GetService<ISqlHelper>();sqlHelper.GetAll();Console.ReadKey();
}

运行结果输出:this is SqlServerHelper

当我们在执行业务逻辑时想要写入一些日志(Log),必然会当然依赖这个类,那么会形成了SqlHelper类与Log类之前的依赖关系,我们可以将之前的依赖关系转移到DI容器中,也就是依赖注入(DI),然后在DI容器获取服务(对象)

示例代码如下:

public interface ISqlHelper 
{void GetAll();
}
public class SqlServerHelper : ISqlHelper 
{private readonly ILog _ilog;public SqlServerHelper(ILog ilog) {_ilog = ilog;}public void GetAll() {_ilog.LogInfo($"我在{typeof(SqlServerHelper).Name}中,我是ilog");Console.WriteLine("this is " + typeof(SqlServerHelper).Name);}
}
public interface ILog 
{void LogInfo(string msg);
}
public class Log : ILog 
{public void LogInfo(string msg) {Console.WriteLine(msg);}
}
private static void Main(string[] args) 
{services.AddTransient<ILog, Log>();//瞬时注入services.AddTransient<ISqlHelper, SqlServerHelper>();//瞬时,每次的实例都是一个新的对象var provider = services.BuildServiceProvider();//构建服务提供商var sqlHelper = provider.GetService<ISqlHelper>();//获取我们需要的服务实例sqlHelper.GetAll();Console.ReadKey();
}

如果如下:

我在SqlServerHelper中,我是ilog
this is SqlServerHelper

三、组件的生命周期

1、Transient:瞬时,每次的实例都是一个新的对象

2、Singleton:单例,全局唯一实例

3、Scoped:作用域,在一个作用域中唯一实例,比如在Asp.Net Core应用程序中一次请求相当于一个Scoped

Transient:瞬时,每次的实例都是一个新的对象

ServiceCollection services = new ServiceCollection();
services.AddTransient<ILog, Log>();
services.AddTransient<ISqlHelper, SqlServerHelper>();
var provider = services.BuildServiceProvider();
var sqlHelper = provider.GetService<ISqlHelper>();//首次获取要使用的服务
sqlHelper = provider.GetService<ISqlHelper>();//获取新的服务
sqlHelper.GetAll();
a7a11cba3eeea6df02169b50d112397c.png
瞬时

结果如下:

1dc12d7d8a87248bf93ec3cbac87e05f.png
瞬时结果

Singleton:单例,全局唯一实例

ServiceCollection services = new ServiceCollection();
services.AddSingleton<ILog, Log>();
services.AddSingleton<ISqlHelper, SqlServerHelper>();
var provider = services.BuildServiceProvider();
var sqlHelper = provider.GetService<ISqlHelper>();
sqlHelper = provider.GetService<ISqlHelper>();
sqlHelper.GetAll();
Console.ReadKey();
ae0be01a4751c212cf80e7d13009e624.png
单例

Scoped:作用域,在一个作用域中唯一实例

一个作用域

ServiceCollection services = new ServiceCollection();
services.AddScoped<ILog, Log>();
services.AddScoped<ISqlHelper, SqlServerHelper>();
var provider = services.BuildServiceProvider();
var scope1 = provider.CreateScope();//在一个作用域下创建第一个子作用域       
var sqlHelper = scope1.ServiceProvider.GetService<ISqlHelper>();
184d686f035adfc6b1278c3abf2d41f9.png

新的作用域

ServiceCollection services = new ServiceCollection();
services.AddScoped<ILog, Log>();
services.AddScoped<ISqlHelper, SqlServerHelper>();
var provider = services.BuildServiceProvider();
var scope1 = provider.CreateScope();
//在一个作用域下创建第一个子作用域       
var sqlHelper = scope1.ServiceProvider.GetService<ISqlHelper>();
var scope2 = provider.CreateScope();
//在一个作用域下创建第二个子作用域
sqlHelper = scope2.ServiceProvider.GetService<ISqlHelper>();
2845d67ba96394f8c4c6bd8a2eaab4df.png

注意:由于是控制台项目,只能用子作用域来体现作用域的特点,在web项目中,一次请求就相当于一个作用域

推荐阅读

  • • 生成条形码二维码DataMatrix条码.EAN码.39码.交叉25码.UPC码.128码.93码.ISBN码.Codabar等

  • • C#生成二维码的两种快捷方式

  • • ShellProgressBar控制台中漂亮的显示进度条

  • • C#10特性试用|全局和隐式usings

资料参考

  • • ServiceCollection 类 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn[1]

  • • ASP.NET Core 中的 ServiceProvider - hippieZhou - 博客园[2]

欢迎关注我的公众号“Net分享”,技术文章第一时间推送 , 分享一些你可能注意不到的细节。

f3a3951a42deb6c84ab209f1924d8b6b.jpeg 

引用链接

[1] ServiceCollection 类 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn: https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.dependencyinjection.servicecollection?view=dotnet-plat-ext-6.0
[2]https://blog.csdn.net/m1m2m3mmm/article/details/123231352

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React+Redux仿Web追书神器

引言 由于 10 月份做的 React Native 项目没有使用到 Redux 等库&#xff0c;写了一段时间想深入学习 React&#xff0c;有个想法想做个 demo 练手下&#xff0c;那时候其实还没想好要做哪一个类型的&#xff0c;也看了些动漫的&#xff0c;小说阅读&#xff0c;聚合资源的开源…

windows配置solr5.5.2(不通过tomcat,使用内置jetty)

一、windows下配置solr5.5.2(不通过tomcat,使用内置jetty) 第一步&#xff1a;安装Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本&#xff0c;没亲测&#xff0c;solr6.0是只支持jdk1.8及以上的&#xff0c;下图为启动solr时的截图&#xff1a; 如何在windows环境下配置jdk及验证…

【C# Personal Handbook】运行环境

一、CLR、CLI、CTS、CLS、BCL、FCL简介CLI&#xff08;公共语言基础&#xff09;CLI是微软公司向ECMA提交的一份语言和数据格式规范&#xff0c;CLR是目前为止唯一一个公共语言基础的实现版本。CLI包括了公共类型系统&#xff08;CTS&#xff09;、公共中间语言&#xff08;CIL…

如何完善自己的知识结构

★领域 &#xff08;本来想用“学科”这个词&#xff0c;后来觉得“学科”的范畴还是偏小&#xff0c;就改用“领域”&#xff09;  按照传统的习惯&#xff0c;通常会把知识归类到不同的领域&#xff08;比如&#xff1a;文学、数学、计算机、烹调、等等&#xff09;。 ◇领…

java调c++代码_Java中调用C++代码的实现 | 学步园

JNI为 Java Native Interface 即Java本地接口&#xff0c;使用此种方式可以对C/C代码进行调用&#xff0c;其在本质上是对C/C生成的动态库进行调用而不是直接对C/C代码进行调用Java代码如下&#xff1a;public class TestJNI{//JNI在本质上是调用C/C的动态库来实现的&#xff…

jeesite1.X 集成多数据源

2019独角兽企业重金招聘Python工程师标准>>> 网上看了几个例子&#xff0c;都是相同数据源的动态切换&#xff0c;如果不是同一种数据库类型&#xff0c;分页查询就出问题。经过研究解决问题。 jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

Horizontal Pod Autoscaling in Kubernetes写在前面我们平时部署web服务&#xff0c;当服务压力大撑不住的时候&#xff0c;我们会加机器(加钱)&#xff1b;一般没有上容器编排是手动加的&#xff0c;临时加的机器&#xff0c;临时部署的服务还要改Nginx的配置&#xff0c;最后…

spark java 逻辑回归_逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件

原标题&#xff1a;逻辑回归分类技术分享&#xff0c;使用Java和Spark区分垃圾邮件由于最近的工作原因&#xff0c;小鸟很久没给大家分享技术了。今天小鸟就给大家介绍一种比较火的机器学习算法&#xff0c;逻辑回归分类算法。回归是一种监督式学习的方式&#xff0c;与分类类似…

jQuery.extend()方法

定义和用法jQuery.extend()函数用于将一个或多个对象的内容合并到目标对象。 注意&#xff1a; 1. 如果只为$.extend()指定了一个参数&#xff0c;则意味着参数target被省略。此时&#xff0c;target就是jQuery对象本身。通过这种方式&#xff0c;我们可以为全局对象jQuery添加…

Wget用法、参数解释的比较好的一个文章

一个语句就可以下载cvpr2016的全部论文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示断点续传&#xff1b;-N表示已经下载的内容不再重…

.NET VS智能提示汉化 (.Net6)

先上现成的.net6汉化文件&#xff0c;可以手动下载后参照 [如何为 .NET 安装本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

老人寻求到一名程序员,用2W行代码给自己打造了一幅肖像画

今天翻墙看了下国外的论坛&#xff0c;看到了一位版主给一位老人描绘肖像画的文章&#xff0c;不得不说这位大佬是真的厉害&#xff0c;近20000行代码&#xff0c;而且还画的很像&#xff0c;像小编我这种手残党&#xff0c;用笔也不能画出来&#xff0c;不得不服&#xff0c;今…

一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

[接上篇]“天下大势&#xff0c;分久必合&#xff0c;合久必分”&#xff0c;ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系统中之后&#xff0c;也许微软还是意识到Web应用和后台服务的承载方式还是应该加以区分&#xff0c;于…

GitHub服务中断24小时11分钟事故分析报告\n

上周&#xff0c;GitHub经历了一次事故&#xff0c;导致服务降级24小时11分钟。虽然平台的某些部分不受事故影响&#xff0c;但仍然有多个内部系统受到了影响&#xff0c;向用户显示了过时且不一致的内容。所幸没有用户数据丢失&#xff0c;但针对几秒钟数据库写入的手动调整工…

php 合并 字符串_PHP如何去重合并字符串

本篇文章主要给大家介绍PHP如何去重合并字符串。推荐教程&#xff1a;《PHP教程》对于PHP学习者来说&#xff0c;合并多个字符串&#xff0c;应该并不是很难。但是如果这多个字符串中&#xff0c;有相同元素&#xff0c;当我们想要合并他们并且要使其值具有唯一值。也就是说合并…

软概(lesson 2):课堂测试

一、测试题目 二、完成过程 1.设计思想 ①连接mysql数据库 ②设计user类&#xff0c;增加参数 ③设计add类&#xff0c;向数据库内增加内容 ④设计addInput页面&#xff0c;完成录入操作 ⑤设计add页面&#xff0c;接收录入的参数&#xff0c;并调用add类函数 2.源代码 user.ja…

谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用

据外媒Android Police报道&#xff0c;如大家所知道的&#xff0c;Chrome浏览器中的“隐身模式”是为了防止你的私密浏览记录被其他人看到&#xff0c;但是&#xff0c;在这种模式下&#xff0c;你的输入法键盘依然会记住你输入的短语&#xff0c;为了阻止你的键盘在Chrome隐身…

php两个数组融合,php合并两个数组的方式有哪些

1、arrary_merge示例代码&#xff1a;$arr1 array(1, 2, 3, 4, 5);$arr2 array(1, 2, 6, 7, 8, 9, 10);$result1 array_merge($arr1, $arr2);$arr3 array("name" > "itbsl", "age" > 13, "sex" > "Male");$arr…

最近对latin-1这个字符集产生了不少好感

【简介】 最近我要解析一个数据库中间件的日志、这个中间件会在日志中记录SQL发往的后台DB ,执行耗时&#xff0c;对应的SQL&#xff1b;中间件直接把SQL写到 了日志中去&#xff0c;并没有对SQL进行适当的编码转换&#xff1b;理想情况下这个也不会有什么问题&#xff0c;不幸…

面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为最少知识原则(LeastKnowledge Principle, LKP)&#xff0c;其定义如下&#xff1a; 迪米特法则(Law of Demeter, LoD)&#xff1a;一个软件实体应当尽可能少地与…