简单讲解Asp.Net Core自带IOC容器ServiceCollection
一、 理解ServiceCollection之前先要熟悉几个概念:DIP、IOC、DI、Ioc容器;
二、 接下来先简单说一下几个概念问题:
1、DIP(依赖倒置原则):六大设计原则里面一种设计原则,它转换了依赖关系,高层模块不依赖于底层模块的实现,而低层模块要依赖于高层模块的接口定义,总的原则就是高层和底层都不互相依赖,两者都依赖与抽象,抽象不依赖于实现,实现应该依赖于抽象
2、IOC(控制反转):一种反转流、依赖和接口的方式(DIP的具体实现方式)
3、DI(依赖注入):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)
4、IoC容器:依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架)。
4. 1、IOC思想就是把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象。组件之间的交互最好的方式就是把new的操作交给第三方的IOC治理框架去做。
4.2、IOC容器能做到哪些
√对接口和实现类实现了由原来的零散式管理到现在的集中化管理
√ 对类之间,类接口之间的关联关系可以采用多种模式注入(构造器注入,属性注入)等等。
√ 对实现类的生命周期进行了统一管理,能够控制服务的创建,释放和监控。
√ 类的依赖由编译时推迟到了运行时。
4.3、微软重新设计的asp.net core 就是基于内建容器ServiceCollection,其实就一个IOC容器,在asp.net core出来之前也有好几种IOC容器如:Autofac、Unity等等
三、 ServiceCollection具体实现(以下程序在控制台演示)
3.1、先创建控制台程序 ,从nuget下载Microsoft.Extensions.DependencyInjection引用
先创建Ibird,再创建Sparrow实现Ibird接口
public interface Ibird
{
void Fly();
}
public class Sparrow : Ibird
{
public string Name { get; set; } ="麻雀"; public Sparrow()
{
Console.WriteLine("正在创建对象。。。。。。");
} public void Fly()
{
Console.WriteLine($"{this.Name}飞来了!!!");
}
}
3.2、ServiceCollection注入生命周期(single,scoped,transient)
3.2 .1、Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例
//IOC容器
ServiceCollection services = new ServiceCollection(); //注册服务 Transient注入方法
services.AddTransient<Ibird, Sparrow>(); var provider = services.BuildServiceProvider(); //从IOC容器取Ibird实例对象
var sparrow1 = provider.GetService<Ibird>();
//再一次从IOC容器取Ibird实例对象
var sparrow2 = provider.GetService<Ibird>(); Console.WriteLine("通过Transient注入的对象,每次取对象是否同一个:"+sparrow1.Equals(sparrow2));
运行结果:对象被创建了2次,两个对象不同

3.2 .2、Singleton:每次从同根容器中( IServiceProvider)获取的时候都是同一个实例
//IOC容器
ServiceCollection services = new ServiceCollection(); //注册服务 Singleton
services.AddSingleton<Ibird, Sparrow>(); var provider = services.BuildServiceProvider(); //从IOC容器取Ibird实例对象
var sparrow1 = provider.GetService<Ibird>();
//再一次从IOC容器取Ibird实例对象
var sparrow2 = provider.GetService<Ibird>(); Console.WriteLine("通过Transient注入的对象,每次取对象是否同一个:"+sparrow1.Equals(sparrow2));
运行结果:对象被创建了1次,两个对象相同

3.2 .3、Scoped:同一个请求中从同一个容器中( IServiceProvider)获取的实例是相同的实例
控制台不好模拟同一个请求多个对象创建生成,可以在asp .net core mvc试试,结果同一个请求中获取实例是一样的,不同请求中获取实例不一样
简单讲解Asp.Net Core自带IOC容器ServiceCollection的更多相关文章
- Asp.Net Core 内置IOC容器的理解
Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...
- .net core系列之《.net core内置IOC容器ServiceCollection》
一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...
- ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期
IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core Controller与IOC的羁绊
前言 看到标题可能大家会有所疑问Controller和IOC能有啥羁绊,但是我还是拒绝当一个标题党的.相信有很大一部分人已经知道了这么一个结论,默认情况下ASP.NET Core的Controller ...
- ASP.NET Core Filter与IOC的羁绊
前言 我们在使用ASP.NET Core进行服务端应用开发的时候,或多或少都会涉及到使用Filter的场景.Filter简单来说是Action的拦截器,它可以在Action执行之前或者之后对请求信息进 ...
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...
- .NET自带IOC容器MEF之初体验
.NET自带IOC容器MEF之初体验 本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuil ...
随机推荐
- scanf的返回值
参考这个博客,https://blog.csdn.net/sinat_40936062/article/details/84348021 #include<stdio.h> int mai ...
- conan使用(二)--创建私有仓库
前面我们已经能够使用conan来从公共服务器上拉取C/C++包来集成进我的工程中,但是在实际开发中,我们可能需要自己封装或使用非公开的库,那么自己搭建一个私服是个很现实的需求. 搭建conan私服有几 ...
- WARN Connection to node 2 could not be established. Broker may not be available. (
启动 kafka 集群, 出现这个问题 WARN Connection to node 2 could not be established. Broker may not be available. ...
- 安卓Jsoup爬虫
第一步:导入Jsoup包:把你的jar包放在libs下面之后 接着就会显示在你的这个地方: 重要的还是源码(搞了很久 出错很多 终于成功):我做的是输入要查找的关键字百度百科爬取主要定义,按照标签爬取 ...
- Dubbo服务集群容错
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- koa中的路由
原生路由 网站一般都有多个页面.通过ctx.request.path可以获取用户请求的路径,由此实现简单的路由. const main = ctx => { if (ctx.request.pa ...
- eclipse中查找类、方法及变量被引用的地方
1.选中要查看的类.方法或变量,然后Ctrl+Shift+G或右键-->References--->Project,就可以找到它所有被引用的地方. 2.对于方法,还可以通过右键--> ...
- [LeetCode] 438. Find All Anagrams in a String 找出字符串中所有的变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- [LeetCode] 435. Non-overlapping Intervals 非重叠区间
Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...
- navicat 11.2.7破解
1,软件安装包目录 2,根据电脑系统安装x64或者x86,安装完成之后将PatchNavicat.exe放到navicat的安装目录下 3,右键以管理员身份运行PatchNavicat.exe,或者双 ...