依赖注入时编程手段中解耦和封装的一个非常重要的手段,我本人已经到了没有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)的更多相关文章

  1. 拥抱.NET Core系列:依赖注入(2)

    上一篇"拥抱.NET Core系列:依赖注入(1)"大体介绍了服务注册.获取和生命周期,这一篇来做一些补充. 由于内容跨度大(.NET Core.ASP.NET Core),所以文 ...

  2. 拥抱.NET Core系列:MemoryCache 缓存域

    在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...

  3. 拥抱.NET Core系列:MemoryCache 缓存域(转载)

    阅读目录 MSCache项目 缓存域 写在最后 在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MS ...

  4. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  5. 拥抱.NET Core系列:MemoryCache 缓存过期

    在上一篇"拥抱.NET Core系列:MemoryCache 初识"中我们基本了解了缓存的添加.删除.获取,那么今天我们来看看缓存的过期机制.这里和上篇一样将把"Micr ...

  6. 拥抱.NET Core系列:MemoryCache 缓存选项

    在上一篇 "拥抱.NET Core系列:MemoryCache 缓存过期" 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介 ...

  7. ASP.NET Core之依赖注入

    本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...

  8. 拥抱.NET Core系列:MemoryCache 缓存选项 (转载)

    阅读目录 MSCache项目 MemoryCacheOptions ExpirationScanFrequency SizeLimit CompactionPercentage 写在最后 在上一篇 ” ...

  9. 拥抱.NET Core系列:MemoryCache 缓存过期 (转载)

    阅读目录 MSCache项目 MSCache提供的过期方式 绝对时间到期 滑动时间到期 自定义过期策略 过期策略组合拳 缓存过期回调 写在最后 在上一篇”拥抱.NET Core系列:MemoryCac ...

  10. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

随机推荐

  1. Servlet起步

    什么是Servlet Servlet是sun公司制定的用来扩展web服务器功能的组件规范,通俗理解为遵循Servlet规范开发的实现了某个功能的Java组件.该组件没有 main 方法,不能独立地运行 ...

  2. Bitwise And Queries

    Bitwise And Queries Time limit: 1500 msMemory limit: 128 MB You are given QQ queries of the form a\ ...

  3. 2D游戏开发(1)

    <外星人入侵> 通过pygame,入门python的2D游戏开发过程,通过教材制作一个打外星人游戏. 1.函数 run_game() import sys import pygame de ...

  4. 【R与数据库】R + 数据库 = 非常完美

    前言 经常用R处理数据的分析师都会对dplyr包情有独钟,它强大的数据整理功能让原始数据从杂乱无章到有序清晰,便于后期进一步的深入分析,特别是配合上数据库的使用,更是让分析师如虎添翼,轻松搞定Exce ...

  5. MyBatis_Generator插件的安装以及简单使用

    MyBatis_Generator_1.3.1.zip 1       下载安装包 安装包名称:MyBatis_Generator_1.3.1.zip 2       在Eclipse上进行安装 l  ...

  6. 错误处理1: D:\a1-C++\C++作业\第五次1.cpp undefined reference to `vtable for Shape'

    在编译程序的时候遇到此误,在google上查,很多地方都说是因为虚基类里面的虚拟析构函数没有提供实现导致的.但是我的已经提供了实现,也不行.最后发现是其他没有提供实现的虚函数造成的.所以,在一个虚基类 ...

  7. 几大排序思想(由javascript编写)

    Hello!我是super喵二~~~今天练了几道面试题,突然觉得好久没有好好归纳 过排序算法了.以前都是用C/java编写排序,这次用js来总结下五大排序算法吧: 1.冒泡排序(常用及常考排序算法): ...

  8. jquery 根据数据库值设置radio的选中

    jsp代码: <label>性 别</label> <input type="radio" value="1" name=&quo ...

  9. 作为前端,我为什么选择 Angular 2?

    转自:https://sanwen8.cn/p/2226GkX.html 没有选择是痛苦的,有太多的选择却更加痛苦.而后者正是目前前端领域的真实写照.新的框架层出不穷:它难吗?它写得快吗?可维护性怎样 ...

  10. nodeJS之流stream

    前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...