ASP.NET Core依赖注入

Ioc 和 DI

  说起依赖注入,就不得不提到控制反转,简单来说依赖注入是控制反转思想的实现方式。

概念

       控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

个人理解

       IoC(控制反转):  就是将原先的new对象这个操作交由第三方容器,由容器统一创建对象并管理其创建对象的生命周期。

控制反转的目的:怎样创建XX对象我要XX对象

生活中的控制反转:自己发电和用电网发电。

DI(依赖注入): 我理解其中“依赖”有两层意思:

  •     类与类之间的依赖关系;
  •     对象的创建依赖于容器; 

注入:不用主动从容器中获取对象,由容器根据对象依赖关系自动注入;

       依赖注入:程序将对象控制权交给容器,统一依赖容器创建对象,类之间的依赖,也是通过容器自动注入; 

IOC为什么可以实现解耦?

 下面的图来自网络,很好的描述了IOC是如何实现解耦的

图1:软件系统中耦合的对象
       如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。
       齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

图2:对象之间复杂的依赖关系
       耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”。

图3:IOC解耦过程
       大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。
      我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

使用

注册和获取服务

     ASP.NET Core 的服务容器是IServiceCollection,IServiceCollection用来构造容器对象IServiceProvider,服务注册之后,调用ServiceCollection值中的BuildServiceProvider()获取ServiceProvider实例。

 .NetCore中依赖注入中几个关键的类型 

  • IServiceCollection:负责存储注册的服务,可以通过其扩展方法进行服务注册;
  • ServiceDescriptor:服务注册时的信息,如服务类型、实现类型、实例类型、生命周期等;
  • IServiceProvider: 理解是常说的容器,是IServiceCollection创建出来的,用来提供实例的;
  • IServiceScope:表示一个容器的子容器的生命周期; 

生命周期

  • Singleton(单例) :整个根容器的生命周期内是同一个对象;通过 services.AddSingleton()方法进行注册;
  • Scoped(作用域) :在容器或子容器的生命周期内,对象保持一致,如果容器释放掉,那就意味着对象也会释放掉;通过 services.AddScoped()方法进行注册;
  • Transient(瞬时) : 每次使用都会创建新的实例;通过 services.AddTransient()方法进行注册; 作者:

  注:services 是  IServiceCollection services ; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值