Net5 自带的 DI

本文深入探讨了IoC(Inversion of Control)的概念,即控制反转,以及如何在实践中通过依赖注入(DI)实现。文章介绍了如何在Startup类中配置服务,并通过IServiceProvider获取服务实例。同时,详细阐述了三种服务生命周期——瞬时、单例和作用域,分别展示了它们在不同场景下的实例创建行为。此外,还提供了代码示例来说明如何在控制器中通过构造函数进行依赖注入。
摘要由CSDN通过智能技术生成

什么是Ioc
把对象的统一创建交给第三方容器来创建

如何使用内置IOC ServerCollection

1.在Starup中的ConfigurServicetion方法中注册服务

services.AddSingleton<ITestServiceA, TestServiceA>();

---------------
 private readonly IServiceProvider _ServiceProvider = null;
 
  ITestServiceA testServiceA = (ITestServiceA)_ServiceProvider.GetService(typeof(ITestServiceA));
            testServiceA.Show();

2.在使用的控制器中,通过构造函数,定义服务的抽象类型,作为参数,在运行时,得到具体的服务

3.调用服务内的方法

(视图中可以使用@inject获取实列)

DI依赖注入:IServerConcetion支持构造函数注入

什么是依赖注入
如果对象a依赖对象b,对象b依赖对象c,就可以了先构造对象c传递给对象b,然后把b传递给a

IServer可以支持无限级层的依赖注入;前提是都要先注入服务(注册抽象和集体的映射关系)

IserverCollention生命周期

那么再创建对象的时候,不同情况,不需要让对象单列,每一次都创建新的对象实列;不同的作用于新的实例

瞬时生命周期:AddTransient 每一次getService获取的实例都是不同的实例(项目中更多的使用)

单例生命周期:AddSingleton单例生命周期,在整个进程中获取的都是同一个实例

作用域生命周期:AddScoped 同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例

#region IServiceCollection生命周期解析

            //瞬时生命周期
            {
                //IServiceCollection serviceCollection = new ServiceCollection();
                //serviceCollection.AddTransient<ITestServiceA, TestServiceA>(); //瞬时生命周期,每一次getService获取的实例都是不同的实例
                //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
                //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();
                //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();
                //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1); //结果为false; 两次获取的对象不是同一个实例
            }

            //单例生命周期
            {
                //IServiceCollection serviceCollection = new ServiceCollection();
                //serviceCollection.AddSingleton<ITestServiceA, TestServiceA>(); //单例生命周期,在整个进程中获取的都是同一个实例
                //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
                //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();
                //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();
                //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1); //结果为 true,是同一个引用,在整个进程中获取的都是同一个实例
            }

            ///作用域生命周期
            {
                //IServiceCollection serviceCollection = new ServiceCollection();
                //serviceCollection.AddScoped<ITestServiceA, TestServiceA>(); //作用域生命周期;同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例
                //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
                //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();
                //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();

                //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1);

                //ServiceProvider serviceProvider1 = serviceCollection.BuildServiceProvider();
                //ITestServiceA testServiceA2 = serviceProvider1.GetService<ITestServiceA>();
                //bool isOK1 = object.ReferenceEquals(testServiceA1, testServiceA2);
            }


            #endregion

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值