欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简单讲解Asp.Net Core自带IOC容器ServiceCollection

程序员文章站 2022-07-10 23:41:24
一、 理解ServiceCollection之前先要熟悉几个概念:DIP、IOC、DI、Ioc容器; 二、 接下来先简单说一下几个概念问题: 1、DIP(依赖倒置原则):六大设计原则里面一种设计原则,它转换了依赖关系,高层模块不依赖于底层模块的实现,而低层模块要依赖于高层模块的接口定义,总的原则就是 ......

   一、  理解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次,两个对象不同

                      简单讲解Asp.Net Core自带IOC容器ServiceCollection

                       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次,两个对象相同

                    简单讲解Asp.Net Core自带IOC容器ServiceCollection

                      3.2 .3、scoped:同一个请求中从同一个容器中( iserviceprovider)获取的实例是相同的实例

                         控制台不好模拟同一个请求多个对象创建生成,可以在asp .net core mvc试试,结果同一个请求中获取实例是一样的,不同请求中获取实例不一样