拥抱.NET Core系列:依赖注入(1)
前言
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。而在现在我们需要这样做:
原文地址:http://www.cnblogs.com/ants/p/7130293.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
拥抱.NET Core系列:依赖注入(1)相关推荐
- 拥抱.NET Core系列:依赖注入(2)
上一篇"拥抱.NET Core系列:依赖注入(1)大体介绍了服务注册.获取和生命周期,这一篇来做一些补充.由于内容跨度大(.NET Core.ASP.NET Core),所以文章并不是非常的 ...
- 拥抱.NET Core系列:MemoryCache 缓存域
MSCache项目 MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布.本篇用了2.0.0版本 开源在 GitHub 上,仓库地址是:http ...
- 拥抱.NET Core系列:MemoryCache 缓存选项
MSCache项目 MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布.本篇用了2.0.0版本 开源在 GitHub 上,仓库地址是:http ...
- 拥抱.NET Core系列:MemoryCache 缓存过期
MSCache项目 MSCache目前最新的正式版是 2.0.0,预览版是2.1.0,会与.NETCore 2.1一起发布.本篇用了2.0.0版本 开源在GitHub上,仓库地址是:https://g ...
- 拥抱.NET Core系列:MemoryCache 初识
MSCache能做什么? 绝对过期支持 滑动过期支持(指定一个时间,TimeSpan,指定时间内有被Get缓存时间则顺延,否则过期) 过期回调 自定义过期 MSCache目前最新的正式版是 2.0.0 ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- .Net Core中依赖注入服务使用总结
一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...
- 拥抱.NET Core系列:Logging (1)
在之前我们简单介绍了 .NET Core 中的 DI组件,没来及了解的童鞋可以翻翻我之前的文章. 接下来会对 .NET Core 中的 Logging 进行介绍. 本文中使用了"Micros ...
最新文章
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- Windows远程桌面连接并传输文件
- ifconfig命令实例
- AI:2020年6月23日北京智源大会演讲分享之机器学习专题论坛——09:45-10:25邢波教授《A Blueprint of Standardized and Composable ML》
- vue切换菜单时不需要页面刷新_antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作...
- 程序怎么跑着 就卡死,句柄泄漏,内存泄漏了
- python中多维数组_python学习笔记-多维数组
- Junk-Mail Filter_并查集(hdu 2473)
- 揪出数据库中看不见的字符
- 关键字 : this /self / parent
- xp3系统登录服务器错误,WindowsXP系统LOL服务器连接异常即将退出怎么解决?
- VS-RK3399 and VS-RK3288 Audio 开发指南
- STM32 TIM1输入捕获配置
- LocalDate、LocalTime、LocalDateTime
- LDAP简介及Java、客户端连接
- 将doc文档生成html页面
- verilog中pullup和pulldown的用法
- 用PYTHON判断一个数是不是素数
- 去IT培训机构学习适合哪些人去学习
- 基于PortAudio+LAME3实现的ASIO多通道音频录制(mp3、WAV )
热门文章
- spring boot aop 记录方法执行时间
- Linux常用C函数-接口处理篇(网络通信函数)
- 第10章-管理Hadoop集群-hadoop 安全模式相关知识点
- sed之G、H、g、h使用
- 孟岩谈Erlang:并行计算和云计算
- NHibernate for .NET 1.2
- Source Generator 单元测试
- NET问答: 为什么 String.IndexOf 在 .net5 和 netcore3 中返回值不一样?
- gRPC四种模式、认证和授权实战演示
- ML.NET Cookbook:(17)如何在分类数据上训练模型?