本文章主要介绍服务定位器模式 注册服务时三个方法与后续获取到的三个对象的生命周期,上篇文章文章介绍服务定位器的基本使用,点此进入:http://t.csdn.cn/zJMJ3
首先探讨“生命周期”这个概念,生命周期描述的就是一个物品的产生和被销毁的过程。我们说一个对象具有不用的生命周期,实际上就是在说:一个对象在内存当中被创建和被销毁时机不完全一致。
具体来说
ServiceCollection.AddTransient<T>(); 以这种方式注入的类型,后续生成的对象 称为瞬时对象
ServiceCollection.AddScoped<T>(); 以这种方式注入的类型,后续生成的对象 称为区域对象
ServiceCollection.AddScoped<T>(); 以这种方式注入的类型,后续生成的对象 称为是单例对象
三种方式的区别在于
瞬时对象:千万不要被名字唬住了,其实就跟我们平时用 T t=new T() 生成的对象一样,后续生成每个对象都是之间都是独立存在,不再被引用是被销毁
区域对象:依附于某个区域生存的对象,关联的区域被销毁,则该对象被同步销毁
单例对象:内存中只会存在一个该类型的对象,基本不会被销毁
补充一个知识:什么是Scope(区域)情况以下例子
class TestClass
{
public void Main()
{
//先创建所有类的容器 IserviceCollection
IServiceCollection serviceCollection = new ServiceCollection();
//项目中可能用到的类注册进入容器,注意我使用了三个不同方法,效果不同,后面解释
serviceCollection.AddTransient<Parent1>();
//创建对象
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
//IServiceScope 就是有ServiceProvider创造的区域
using (IServiceScope scope= serviceProvider.CreateScope()) {
IServiceProvider scopeServiceProvider= scope.ServiceProvider;
Parent1 parent1= scopeServiceProvider.GetService<Parent1>();
}
}
}
//以下为需要注册进ServiceCollection的类型
class Parent1
{
public void DoSomethings()
{
Console.WriteLine("我是父类1");
}
}
其中IServiceScope scope= serviceProvider.CreateScope()就是用创建一个区域对象,可以简单的认为外面包裹的using(IServiceScope scope= serviceProvider.CreateScope()){ xxx } 就是区域的边界 代码“xxx”中最后一句代码执行完,则意味这出了这个区域,此时不止scope这个对象会被销毁,连同scope创建出来的对象(Parent2 parent2= scopeServiceProvider.GetService<Parent2>();)也会被销毁,这就是区域对象的特点。
注意:
using(){}的本质是一种语法糖,本质上是对于继承IDisposable接口的对象一种及时销毁的机制,对于新手的我们来说 暂时可以认为他是某些特定对象的边界,只要代码运行出这个边界,某些特定对象就会被销毁的。
可能有些同学会问,这个不同生命周期设计出来有什么用,我们可以暂时把这个疑问放起来,后面有实际的案例会解答相应的疑问。若是你是在不能接受,你可以这么想,内存中的对象就像我们身体中的细胞,有些细胞(比如神经元)从我们出生开始(执行文件被加载到内容当中)就一直在我们的身体里存在,直到我们去世(程序被关闭)才销毁,有些细胞(比如原本填满手脚趾中间空隙的细胞)在完成了自己使命的时候就要凋亡。计算机程序是对现实的抽象,假如我们要去模拟人体细胞的生命周期,那本文中的生命周期机制,不就正好能派上用场吗