.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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐