一、  理解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试试,结果同一个请求中获取实例是一样的,不同请求中获取实例不一样

最新文章

  1. Java基础知识【上】(转载)
  2. Java并发编程学习笔记(二)——对象的共享
  3. shell生成随机数的几种方法
  4. CMake 命令行设定编译环境
  5. 百度之星B题(组合数)
  6. 2^x mod n = 1 【杭电-HDOJ-1395】 附题
  7. 测序分析软件-phred的安装
  8. 基于angularJs的单页面应用seo优化及可抓取方案原理分析
  9. 201521145048《Java程序设计》第11周学习总结
  10. hibernate 常用主键生成策略与配置
  11. C语言函数-socket
  12. openstack快速复制一台云主机系统
  13. DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)
  14. 【BZOJ2431】【HAOI2009】逆序对数列 DP
  15. 关于FastJSON
  16. 显卡、GPU和CUDA简介
  17. ettercap+arpspoof进行HTTP信息嗅探
  18. Net SMTP QQ 发送邮件
  19. Java高级工程师需要弄明白的20个知识点
  20. 理解IOC

热门文章

  1. ERP WIP 部分API应用 详解
  2. lvm调整卷大小
  3. 201871010109-胡欢欢《面向对象程序设计(java)》第十周学习总结
  4. yum 初始化国内
  5. &lt;Random&gt;382 380
  6. 微信小程序特性总结
  7. [LeetCode] 155. Min Stack 最小栈
  8. 第09组 Beta冲刺(3/5)
  9. okhttp 发送get post 请求
  10. Java后端传Long类型给前端导致的精度丢失