拥抱.NET Core系列:依赖注入(1)
依赖注入时编程手段中解耦和封装的一个非常重要的手段,我本人已经到了没有DI无法编写项目的程度了,在.NET Framework中微软并没有在FCL中引入DI,虽然推出了“Unity”。而在.NET Core中DI几乎是所有组件的标配可见DI有多么的重要,本节主要简单介绍下微软在.NET Core中加入的DI组件。
前言
DIP、IoC、DI
说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系。
依赖倒置原则(DIP):软件设计原则,要依赖于抽象,不要依赖具体实现。
控制反转(IoC):一种实现DIP原则的模式。
依赖注入(DI):IoC的具体实现。
DIP就好比一个目标一个法则。
IoC就好比是论文,“应该怎么做才能遵循DIP”
DI就好比是实际的产品,“落实到具体的语言的工具”
关于这个比喻可能不是很准确,大家可以使用搜索引擎去了解更为详细的差异。
在.NET
在我接触的很多.NET项目中,很少有人使用DI,更别提像Orchard那样把DI用得出神入化。而复杂的代码很大一部分的原因是没有引入DI。在java中几乎从刚入门的新手都使用Spring提供的DI。
依赖注入生命周期
生命周期是指对服务实例的存活状态控制,"Microsoft.Extensions.DependencyInjection"提供了一个枚举定义了三种生命周期状态。
类型 | 描述 |
Singleton | 单例服务,从当前服务容器中获取这个类型的实例永远是同一个实例。 |
Scoped | 域内单例,为每个作用域创建一个服务实例,也就是说域内单例(域类似子容器)。 |
Transient | 瞬态,从服务容器中每获取一次创建一个新的实例。 |
用例服务
代码如下:
注册服务的N种姿势
其实可以很容易的看出,服务注册是通过创建一个“ServiceDescriptor”来完成的,而其它方式的注册只不过是基于一个方法的封装而已,让使用者可以更为方便的进行服务注册。
我们可以通过很多手段去注册一个服务,但这里推荐大家优先使用扩展方法进行服务注册,因为这样的代码更易读。反射循环注入时可以使用其它方式。
服务使用
首先我们来看一下服务提供者提供的方法签名。
可以发现与服务注册一样,基于同一个方法提供了很多扩展方法让使用者更加便捷的获取服务。
我们先来看“GetService<T>”与“GetRequiredService<T>”这两个方法。
这两个方法非常接近,唯一不同的是GetRequiredService会在找不到服务的时候抛出异常,而GetService在找不到服务时会返回null。
“GetServices”这个方法是用来获取多个服务实例,该方法会返回该类型注册的多个服务实例。我们来看个例子:
服务的生命周期
我们可以通过运行结果很好的理清各个生命周期的用意。下面用一张图来说明较复杂情况下“scope”的服务结果。
小技巧
注册支持延迟加载的服务
开发过程中经常有一种情况,服务A的A方法依赖了服务B,而服务A的B方法依赖了服务C,这时候你就得在构造函数上同时声明服务B和C,就像这样。
这在其它DI组件中非常常见,比如autofac。而在现在我们需要这样做:
写在最后
.NET技术栈QQ群:384413261(点击加入.NET Group)
拥抱.NET Core系列:依赖注入(1)的更多相关文章
- 拥抱.NET Core系列:依赖注入(2)
上一篇"拥抱.NET Core系列:依赖注入(1)"大体介绍了服务注册.获取和生命周期,这一篇来做一些补充. 由于内容跨度大(.NET Core.ASP.NET Core),所以文 ...
- 拥抱.NET Core系列:MemoryCache 缓存域
在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...
- 拥抱.NET Core系列:MemoryCache 缓存域(转载)
阅读目录 MSCache项目 缓存域 写在最后 在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MS ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- 拥抱.NET Core系列:MemoryCache 缓存过期
在上一篇"拥抱.NET Core系列:MemoryCache 初识"中我们基本了解了缓存的添加.删除.获取,那么今天我们来看看缓存的过期机制.这里和上篇一样将把"Micr ...
- 拥抱.NET Core系列:MemoryCache 缓存选项
在上一篇 "拥抱.NET Core系列:MemoryCache 缓存过期" 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介 ...
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 拥抱.NET Core系列:MemoryCache 缓存选项 (转载)
阅读目录 MSCache项目 MemoryCacheOptions ExpirationScanFrequency SizeLimit CompactionPercentage 写在最后 在上一篇 ” ...
- 拥抱.NET Core系列:MemoryCache 缓存过期 (转载)
阅读目录 MSCache项目 MSCache提供的过期方式 绝对时间到期 滑动时间到期 自定义过期策略 过期策略组合拳 缓存过期回调 写在最后 在上一篇”拥抱.NET Core系列:MemoryCac ...
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
随机推荐
- 第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)
前言 这部分也许是数据预处理最为关键的一个阶段. 如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析. 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给 ...
- Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...
- grok 匹配log4j
input { file { codec => multiline { pattern => "^\[2016" negate => true what => ...
- .net Core1.0 邮件发送
今天一天早,公司需要将之前的.net Core项目增加一个预处理机制,就是当程序出现异常后给我们的开发人员发送邮件,因为今天写些关于.netCore上发送邮件. 根据查阅资料发现在目前的Core1.0 ...
- Python可视化:Seaborn库热力图使用进阶
前言 在日常工作中,经常可以见到各种各种精美的热力图,热力图的应用非常广泛,下面一起来学习下Python的Seaborn库中热力图(heatmap)如何来进行使用. 本次运行的环境为: windows ...
- nodeJS之进程process对象
前面的话 process对象是一个全局对象,在任何地方都能访问到它,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制.本文将详细介绍process对象 概述 process ...
- Java中设计模式之装饰者模式-3
装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...
- Python函数之简单总结
函数的定义 Python的函数定义使用关键字def,如定义一个返回绝对值的函数my_abs def my_abs(x): if x>=0: return x else: return -x 函数 ...
- 文件快速删除工具, 解决你的node_modules
摘要: 还在为删除文件慢烦恼吗?强大工具dlf来帮助你.作为一名前端开发,最常见的就是node_modules,如果dependencies很多,osx系统删除还好,Windows用户就麻烦了.本文分 ...
- 基于C#的接口自动化测试(二)
Json多重数据处理方法II:jobj直接向后调用即可 ]["GoodsName"]; 用:分隔的字符串转字典: public static Dictionary<strin ...