.NetCore——浅谈DI注入AddSingleton,AddTransient,AddScoped的区别

  • Post author:
  • Post category:其他




.NetCore——浅谈DI注入AddSingleton,AddTransient,AddScoped的区别



一、依赖注入

依赖注入(Dependency Injection),简称DI注入。是实现对象与其协作者或依赖关系之间松散耦合的技术。为了执行其操作,类所需的对象不是直接实例化协作者或使用静态引用,而是以某种方式提供给类。



二、实现

在代码中分别用三种方式进行注入,具体看注释

在这里插入图片描述

/*
              单例注入
              任何时候构造的都是同一个实例
             */
            serviceDescriptors.AddSingleton(typeof(MyClass1));
            /*
              瞬时注入
              每次都构造一个新的实例
             */
            serviceDescriptors.AddTransient(typeof(MyClass2));
            /*
              作用域注入
              在同一个作用域中构造的是同一个实例,同一个作用域不同线程也构造的是同一个实例。
              只有在不同的作用域中构造的是不同的实例。(即在同一个请求,都是同一个实例。)
             */
            serviceDescriptors.AddScoped(typeof(MyClass3));

下面通过示例进行测试

在这里插入图片描述


            {   //单例
                var service = serviceDescriptors.BuildServiceProvider();
                var aa = service.GetService<MyClass1>();
                var bb = service.GetService<MyClass1>();
                Console.WriteLine(object.ReferenceEquals(aa, bb));
            }
            {   //瞬时
                var service = serviceDescriptors.BuildServiceProvider();
                var aa = service.GetService<MyClass2>();
                var bb = service.GetService<MyClass2>();
                Console.WriteLine(object.ReferenceEquals(aa, bb));
            }
            {   //作用域(同一个作用域)
                var service = serviceDescriptors.BuildServiceProvider();
                var aa = service.GetService<MyClass3>();
                var bb = service.GetService<MyClass3>();
                Console.WriteLine(object.ReferenceEquals(aa, bb));
            }
            {   //作用域(不同作用域)
                var service1 = serviceDescriptors.BuildServiceProvider();
                var service2 = serviceDescriptors.BuildServiceProvider();
                var aa = service1.GetService<MyClass3>();
                var bb = service2.GetService<MyClass3>();
                Console.WriteLine(object.ReferenceEquals(aa, bb));
            }
            {   //作用域(同一个作用域,不同线程)
                var service = serviceDescriptors.BuildServiceProvider();
                MyClass3 aa = null, bb = null;
                Task.Run(() =>
                {
                    aa = service.GetService<MyClass3>();
                });
                Task.Run(() =>
                {
                    bb = service.GetService<MyClass3>();
                });
                Console.WriteLine(object.ReferenceEquals(aa, bb));
            }

通过运行示例代码可以清楚的对比出来实例是否相同,下面看一下运行的结果

在这里插入图片描述

通过对DI的注入生命周期的理解,可以在开发过程中选择合理的方式进行注入。


官网直通车——>


环境:


vs2019

.netcore3.1



版权声明:本文为qq_40579788原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。