.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 版权协议,转载请附上原文出处链接和本声明。