一、  理解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的更多相关文章

  1. Asp.Net Core 内置IOC容器的理解

    Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...

  2. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

  3. ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期

    IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...

  4. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  5. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  6. ASP.NET Core Controller与IOC的羁绊

    前言 看到标题可能大家会有所疑问Controller和IOC能有啥羁绊,但是我还是拒绝当一个标题党的.相信有很大一部分人已经知道了这么一个结论,默认情况下ASP.NET Core的Controller ...

  7. ASP.NET Core Filter与IOC的羁绊

    前言 我们在使用ASP.NET Core进行服务端应用开发的时候,或多或少都会涉及到使用Filter的场景.Filter简单来说是Action的拦截器,它可以在Action执行之前或者之后对请求信息进 ...

  8. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

  9. .NET自带IOC容器MEF之初体验

    .NET自带IOC容器MEF之初体验   本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuil ...

随机推荐

  1. spring boot的gradle整合日志

    1.引入包configurations { providedRuntime // remove default logger all*.exclude group: 'org.springframew ...

  2. python中lambda

    lambda_expr ::= "lambda" [parameter_list]: expression python中lambda可以理解为一个匿名函数,它的要求是函数的运算部 ...

  3. 转:oracle 体系结构

    前几天面试的时候面试官才问过我ORACLE的体系结构,让我在一张白纸上画出来.回头想想当时答得还不错,大部分内容都描述出来了,呵呵,刚才在网上看到一篇讲解ORACLE体系结构的文章,觉得不错,转过来存 ...

  4. 【前端_css】RGB 常用颜色列表

    转载博客:RGB 常用颜色列表

  5. c# list集合简单快捷取随机

    C#怎么在list集合中随机取出一个值: 首先我们取出这个List列表 然后生成随机数 最后通过这个随机数当作索引实现 var list = studentlist.OrderBy(a => a ...

  6. FusionSphere产品功能

    华为Fusion产品 FusionSphere解决方案的三种场景 服务器虚拟化 NFVI:运营商基于openstack kvm协议的解决方案 云数据中心 FusionSphere服务器虚拟化解决方案 ...

  7. Dart Flutter

    下载Flutter Google下载地址: https://storage.googleapis.com/dart-archive/channels/stable/release/2.3.0/sdk/ ...

  8. index.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  9. LAMP组合

    动,静资源: 静态资源:客户端从服务器获得的资源表现形式与原文件相同 动态资源:通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端. 我们还可以这样理解静态资源:服务器端接入到客户端的请求 ...

  10. Centos7 安装mysql-8.0.18(rpm)

    1.前言 当前MySQL最新版本:8.0.18 (听说比5.7快2倍)官方之前表示:MySQL 8.0 正式版 8.0.18 已发布,MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量 ...