简单讲解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 ...
随机推荐
- 获取List<object>中对象的属性值
List<object> ls = new List<object>(); ls.Add(,name="sqm"}); ls.Add(,name=" ...
- linux的initcall机制
linux的initcall机制(针对编译进内核的驱动) initcall机制的由来 我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者 ...
- mysql_innodb存储引擎的优化
采用innodb作为存储引擎时的优化 innodb_buffer_pool_size 如果用 Innodb,那么这是一个重要变量.相对于 MyISAM 来说,Innodb对于 buffer size ...
- Paxos算法—前世
Paxos算法是基于消息传递且具有高度容错特性的一致性算法.我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议. 一.客户端-服务器模型 我们从最小的 ...
- 石欣钰-201871010117 《面向对象程序设计(java)》第六、七周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- javaConfig下的springmvc配置
javaConfig下的springmvc配置 一.静态资源过滤 XML的配置 <mvc:resources mapping="/**" location="/&q ...
- Python 包:
分享一波油藏描述方面的Python开源包 前一阵去捷克参加了数学地质年会(IAMG2018),听完汇报,发现在数学地质领域用python的越来越多了,他们的很多成果都是用python做出来的.不管喜不 ...
- html--前端jquery初识
一.把 jQuery 添加到您的网页如需使用 jQuery,需要下载 jQuery 库,然后把它包含在希望使用的网页中.jQuery 库是一个 JavaScript 文件,您可以使用 HTML 的 & ...
- 原生js-input框全选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 8.9 NOIP模拟测试15 建设城市(city)+轰炸行动(bomb)+石头剪刀布(rps)
鉴于T3的惨烈程度,我决定先来颓篇题解. T1 建设城市(city) 挡板法+容斥 m个建设队分成n组,每组必须有一个,先不考虑上限,共有 C(m-1,n-1)种方案. 有i个组是超过k个的,容斥掉 ...