一、  理解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. JS高阶---对象创建模式(5种)

    [前言] 函数高级部分先看到这里,接下里看下面向对象高级部分 .对象创建模式 .继承模式 [主体] (1)Object构造函数模式 案例如下: 测试结果如右图所示 (2)对象字面量形式创建 案例如下: ...

  2. 02-cmake语法-if、条件表达

    格式: if(expression) # then section. COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... elseif(expression2) # e ...

  3. centos虚拟机 与主机同步时间

    同步系统时间: yum install ntp ntpdate cn.pool.ntp.org ntpdate 0.centos.pool.ntp.org rm /etc/localtime ln - ...

  4. Spring Cloud版本 version命名说明 (Edgware)

    Spring Cloud版本 version命名说明 (Edgware)   版权声明:guofangsky 版权所有,转载不究. https://blog.csdn.net/guofangsky/a ...

  5. javascript中的e是什么意思?

    e 代表事件(event)对象,即所谓的事件驱动源,包含了许多属性和方法.下面以鼠标点击事件为例,作一个测试: (HTML) <!DOCTYPE html> <html> &l ...

  6. 11/6 <bit manipulation>

    389. Find the Difference ^ (按位异或): 参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0. 抵消掉相同的位,剩下的就是多余的位. class ...

  7. Vue插槽详解 | 什么是插槽?

    作者 | Jeskson 来源 | 达达前端小酒馆 什么是插槽?插槽的指令为v-slot,它目前取代了slot和slot-scope,插槽内容,vue实例一套内容分发的api,将slot元素作为承载分 ...

  8. [LeetCode] 737. Sentence Similarity II 句子相似度之二

    Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...

  9. Sentinel: 分布式系统的流量防卫兵

    前言 在 Spring Cloud 体系中,熔断降级我们会使用 Hystrix 框架,限流通常会在 Zuul 中进行处理,Zuul 中没有自带限流的功能,我们可以自己做限流或者集成第三方开源的限流框架 ...

  10. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

    ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs. ...