内置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,一经查实,立即删除!

相关文章

java中 有没有方法将浏览器标签栏去掉_用JS去掉IE窗口的标题栏,工具栏,地址栏...

前言:经常上网的朋友可能会到过这样一些网站&#xff0c;一进入首页立刻会弹出一个窗口&#xff0c;或者按一个连接或按钮弹出&#xff0c;通常在这个窗口里会显示一些注意事项、版权信息 、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容…

React+Redux仿Web追书神器

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

【算法】LeetCode算法题-Maximum Subarray

这是悦乐书的第154次更新&#xff0c;第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题&#xff08;顺位题号是53&#xff09;。给定一个整数数组nums&#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及验证…

java起源英文_Abbreviation 英文词组缩写(来源:南阳理工大学ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【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;。 ◇领…

MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》&#xff0c;如涉及版权问题&#xff0c;请联系&#xff1a;156204968qq.com。 出版社&#xff1a;人民邮电出版社&#xff0c; 页数&#xff1a;525。 本系列教程目前基于MATLABR2006a&#xff0c;可能对于更高级…

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程&#xff1a; 2017年6月5日12:54:28 笔记&#xff1a; 廖雪峰python2.7教程1.用任何编程语言来开发程序&#xff0c;都是为了让计算机干活。 2.Python是一种相当高级的语言。代码少还不好&#xff1f;代码少的代价是运行速度慢。3.用Python可以做什么…

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;最后…

jQuery 基金会和 Dojo 基金会合并:Open Web

统一基金会&#xff0c;服务开发人员&#xff0c;推动开放 Web 技术发展jQuery 基金会和 Dojo 基金会今天宣布计划联合&#xff0c;旨在建立最大&#xff0c;最多样化和最全面的基金会&#xff0c;通过服务开发者&#xff0c;他们的项目&#xff0c;他们的社区来构建开放的 Web…

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添加…

1066. 图像过滤(15)

原题: https://www.patest.cn/contests/pat-b-practise/1066 思路: 开胃小菜 实现: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 题…

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)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

go 返回mysql数组_Go基础之--操作Mysql(一)

关于标准库database/sqldatabase/sql是golang的标准库之一&#xff0c;它提供了一系列接口方法&#xff0c;用于访问关系数据库。它并不会提供数据库特有的方法&#xff0c;那些特有的方法交给数据库驱动去实现。database/sql库提供了一些type。这些类型对掌握它的用法非常重要…

Vue CLI 3开发中屏蔽烦人的EsLint错误

问题 Vue开发中&#xff0c;特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误。有关EsLint这个工具的作用不再赘述。查阅网上参考文档&#xff0c;大多是针对早起版本Vue CLI工具项目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…