.NET依赖注入(基础)-服务定位器2(生命周期)

本文章主要介绍服务定位器模式 注册服务时三个方法与后续获取到的三个对象的生命周期,上篇文章文章介绍服务定位器的基本使用,点此进入: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>();)也会被销毁,这就是区域对象的特点。

注意:

  1. using(){}的本质是一种语法糖,本质上是对于继承IDisposable接口的对象一种及时销毁的机制,对于新手的我们来说 暂时可以认为他是某些特定对象的边界,只要代码运行出这个边界,某些特定对象就会被销毁的。

  1. 可能有些同学会问,这个不同生命周期设计出来有什么用,我们可以暂时把这个疑问放起来,后面有实际的案例会解答相应的疑问。若是你是在不能接受,你可以这么想,内存中的对象就像我们身体中的细胞,有些细胞(比如神经元)从我们出生开始(执行文件被加载到内容当中)就一直在我们的身体里存在,直到我们去世(程序被关闭)才销毁,有些细胞(比如原本填满手脚趾中间空隙的细胞)在完成了自己使命的时候就要凋亡。计算机程序是对现实的抽象,假如我们要去模拟人体细胞的生命周期,那本文中的生命周期机制,不就正好能派上用场吗

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值