大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

原文:大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

   转发时请注明原创作者及地址,否则追究责任。原创:alunchen

  在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转。

三种对象生命周期

关于.Net Core中的容器,有三种对象的生命周期,这个从网上搜索也有大堆的资料。为了循序渐进,我们这里介绍一下。

Transient

称为短暂,意思是需要使用时就创建一个新的对象。从容易层面讲,当从容器取出时,都创建一个新的对象。这种是最常用的,因为我们一般使用对象都直接创建。

Scope

      称为范围使用,在ASP.Net Core中,Scope就是在一次API请求中,都是同一个对象。最经典的要数EF框架中,添加Context是用Scope类型。即在一次请求中,创建一个DB连接,请求完毕断开连接。

更深一层说,在子容器中,scope都是同一个对象;根容器中,scope全部都是同一个对象,等同于单例。

Singleton

称为单例模式,此模式也是常用。一般需要创建全局的单例,如数据库连接类、配置类、公共类等。此类型在一个应用中,永远都只有一个对象,所以要注意线程的问题。

大话.Net Core

在.Net Core中,原生的依赖注入框架是Microsoft.Extensions.DependencyInjection。

在此框架中,容器类是集成于接口IServiceCollection的ServiceCollection。简单地理解此类是一个集合,装载了所有对象。还有一个常用的是ServiceProvider,此类是提供从容器ServiceCollection获取集合的操作。

简单的依赖注入

下面,我们在控制台应用中简单地使用一下依赖注入。

首先创建两个实体,一个电话Phone,一个电话筒Microphone。电话筒是作为电话的一个属性。

然后,我们创建容器并且从容器中获取对象。

从上面,我们可以打印到Phone的信息,并且也能打印Microphone的信息。因为我们把两个对象都放入到了容器集合中。

在上面的例子中,Microphone是作为构造参数,被依赖于Phone中。这种注入,称为构造器注入。而且在.Net Core中,只有这种依赖方式。还有其它的依赖方式,如方法注入、属性注入。

那么,为什么在.Net Core中只有构造器注入呢?因为在所有注入方式来说,构造器注入是最正宗的注入。好处在于:保证依赖不可变、保证依赖不可空、避免了循环依赖、提升了代码的可复用性。

并不是说构造器注入是万金油,也有些情况需要用属性注入等方式。所以,后面的注入方式.Net Core迟早要加入。

构造器注入选择

在.Net Core中,构造器注入的选择都是选择最多参数的,并且此参数都属于容器中。

要证明上面的观点,我们做下面最经典的例子来说明。

创建3个类,分别为A、B、C。C类依赖与A与B,如下:

初始化容器,并取出C类。

我们可以看到控制台打印:【in a b】。

所以,验证了上面的观点。使用构造注入时,使用构造参数最多,并且参数都属于容器中的构造器。

总结

上面浅析了DI与IOC在.Net Core中的应用。介绍了三种不同的生命周期与场景,使用构造器注入时.Net Core的选择。

可以关注本人的公众号,多年经验的原创文章共享给大家。

   

原文地址:https://www.cnblogs.com/lonelyxmas/p/10217640.html

时间: 2024-10-07 13:10:37

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC的相关文章

PHP 依赖注入和控制反转再谈(二)

今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我个人的原则总是先简单瞟一眼概念,通过实例来对概念加深理解了) 要想理解 PHP 依赖注入 和 控制反转 两个概念,我们还是必须搞清楚下面的两个问题: DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control 控制反转 什么是依赖注入 没有

Java的依赖注入(控制反转)

两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dependency Injection(DI); 控制反转,Inversion of Control(IoC). 3.作用:削减计算机程序的耦合问题: 4.为什么叫"控制反转":创建被调用者的工作不再由调用者来完成,因此称为控制反转.结合Java说,当某个Java实例需要其他Java实例时,系

[ASP.NET Core 3框架揭秘] 依赖注入:控制反转

ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样会频繁地使用到它们.对于这里提到的这几个基础框架,依赖注入尤为重要.ASP.NET Core应用在启动以及后续针对请求的处理过程中,它会依赖各种的组件提供服务.为了便于定制,这些组件一般会以接口的形式进行"标准化",我们将这些标准化的组件统一称为"服务(Service)"

谈谈php依赖注入和控制反转

要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection   依赖注入 IoC--Inversion of Control  控制反转 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取的

Spring 的核心机制:依赖注入(控制反转)

一.说到依赖注入(控制反转),先要理解什么是依赖. Spring 把相互协作的关系称为依赖关系.假如 A 组件调用了 B 组件的方法,我们可称A 组件依赖于 B 组件. 二.什么是依赖注入. 在传统的程序设计过程中,通常由调用者来创建被调用者的实例. 在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转:创建被调用者实例的工作通常由Spring 容器来完成,然后注入给调用者,因此也称为依赖注入. 三.依赖注入的好处. 依赖注入让 Spring 的 Bean 以被指文件组织在

php之依赖注入和控制反转

  DI——Dependency Injection   依赖注入  IoC——Inversion of Control  控制反转  要想理解上面两个概念,就必须搞清楚如下的问题: 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源

反射机制、依赖注入、控制反转

反射机制 正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之. 反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法. 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码. 反射是.Net中获取 运行时类型信息的方式,.Ne

(转)依赖注入和控制反转

发现一篇介绍依赖注入和控制反转的文章,特转载以备后用. 文章地址1:http://baitai.iteye.com/blog/792980 相关文章:http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html: http://www.cnblogs.com/xingyukun/archive/2007/10/20/931331.html: http://www.cnblogs.com/zhenyulu/articles/6417

简单解析依赖注入(控制反转)在Spring中的应用

IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 大家都知道,依赖注入是Spring中非常重要的一种设计模式.可能很多初学者对这种看起来高深的东西有一种抗拒,这里就 简单介绍一下到底什么是依赖注入,Spring到底又到底是如何运用依赖注入的. 依赖关系:在A组件中要引用B组件的对象,则称A依赖于B依赖关系会造成各组件之间的硬编码,为解决依赖关系,一般的解决方法如下: 1.A组件先创建B组件,在调用B组件方法2.A组件先通