大话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的选择。
可以关注本人的公众号,多年经验的原创文章共享给大家。

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC的更多相关文章
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- 浅谈(IOC)依赖注入与控制反转(DI)
前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...
- PHP 依赖注入和控制反转再谈(二)
今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- Java的依赖注入(控制反转)
两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...
- .NET Core的依赖注入[1]: 控制反转
写在前面:我之前写过一系列关于.NET Core依赖注入的文章,由于.NET Core依赖注入框架的实现原理发生了很大的改变,加上我对包括IoC和DI这些理论层面的东西又有了一些新的理解,所以我在此基 ...
- 简单解析依赖注入(控制反转)在Spring中的应用
IoC——Inversion of Control 控制反转DI——Dependency Injection 依赖注入 大家都知道,依赖注入是Spring中非常重要的一种设计模式.可能很多初学者 ...
- 谈谈php依赖注入和控制反转
要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection 依赖注入 IoC--Inversion of Control 控制反转 1. ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
随机推荐
- IO模型的介绍
Stevens 在文章中的一种IO Model: ****blocking IO #阻塞 IO (系统调用不返回结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错才返回) *** ...
- 关于CSS层叠机制
谈到层叠机制,首先我们要知道什么是声明冲突. 声明冲突有三个条件:①多个选择器选中同一个元素:②声明块里的属性相同:③属性的属性值不同.同时满足这三点时就会产生声明冲突.比如下图html代码: < ...
- Ubuntu 16.04.2 配置VNC
1安装包apt-get update sudo apt install xfce4 xfce4-goodies tightvncserversudo apt-get install vnc4serve ...
- dell T130服务器加内存
需求:客户一台dell T130塔式服务器,由于本机只有一条8G内存,系统运行比较慢,需要再增加一条8G内存. 增加过程:第一次增加时由于没有注意机器上内存频率是2133的,所以新增加的一条2400频 ...
- springboot 不同环境切换不同的配置文件
开发的流程是本地>测试>预发布>正式,所以不同的环境,肯定是不同的配置文件,所以我们需要针对不同的环境做不同的配置切换. 下面我们来说说 springboot 是怎么来切换的: 1. ...
- eclipse安装及配置pydev
1.首先安装jre,这里记住jre的安装目录,32位操作系统默认安装在“C:\Program Files (x86)\Java\jre1.8.0_91” 2.配置eclipse,这里使用的是压缩包不需 ...
- 第40节:Java中的IO知识案例
流是一连流串的字符,是信息的通道,分输出流和输入流. IO的分类 第一种分:输入流和输出流. 第二种分:字节流和字符流. 第三种分:节点流和处理流. Java中流的分类: 流的运动方向,可分为输入流和 ...
- 使用PageHepler分页
首先需要引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...
- Mybatis Cause: java.lang.ClassNotFoundException: Cannot find class:
MyBatis原因:java.lang.ClassNotFoundException:找不到类. 原因你的xml文件中的返回类型错误,没有找到这个类. 检查类名是否正确,检查路径是否正确. 在复制my ...
- gdb remote 使用
//设置halt (gdb) set {int}0x400b0000 = 0x1(gdb) load //设置下一个pc指针的值(gdb) set {int}0x400b2000 = 0x80(gdb ...