拥抱.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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来自学长同学分享的学习方法

点击上方蓝色关注我们&#xff01;本文原创&#xff1a;陈浴森同学在科技高度发展的今天&#xff0c;计算机在生活中的作用越来越突出。在学校这一年多的学习当中&#xff0c;我总结了不少的经验&#xff0c;让我在以后的学习当中受益匪浅。一开始没学编程的时候&#xff0c;看…

训练集样本不平衡问题对CNN的影响

转载自 训练集样本不平衡问题对CNN的影响 训练集样本不平衡问题对CNN的影响 本文首发于知乎专栏“ai insight”&#xff01; 卷积神经网络&#xff08;CNN&#xff09;可以说是目前处理图像最有力的工具了。 而在机器学习分类问题中&#xff0c;样本不平衡又是一个经常遇到…

银行转账案例

[1] 案例需求 用户访问登录页面&#xff0c;在页面中输入用户名和密码点击登录&#xff0c;登录成功后 进入到主页中。如果登录败&#xff0c;则在登录页面中提示用户用户名或密码错误。在主页面中&#xff0c;用户在填写银行转账信息&#xff0c;包括:转账账户&#xff0c;转账…

20级、19级 | 一天一瞬间!【日更】

点击上方蓝色关注我们&#xff01;欢迎来到今天的一天一瞬间专栏今天是2020年09月08日&#xff0c;天气状况&#xff1a;炎热。19级目前还是上午上课下午补课&#xff0c;补课私下里和我说&#xff0c;班内学生表现都不错&#xff0c;听罢&#xff0c;甚是开心&#xff0c;不管…

一张图看懂小程序全生态

6月9日小程序发布整半年&#xff0c;这半年里&#xff0c;小程序接连经历了&#xff1a;受追捧——遇冷——质疑——趋于理性的过程。我们对小程序这半年来的产业发展做了全面的梳理&#xff0c;从中可以发现&#xff0c;小程序已俨然形成了自己的生态体系&#xff0c;这一生态…

自然语言处理中的Attention Model:是什么以及为什么[一]

转载自 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[一] 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[一] 1、前言 要是关注深度学习在自然语言处理方面的研究进展&#xff0c;我相信你一定听说过Attention Model&#xff08;后文有时…

204787 ,194787 |0001 1131 0001 4226 7035 ![2480 ]

点击上方蓝色关注我们&#xff01;0006 6143 0037 7139 ,2598 4192 0007 7240 0681 1331 0226 ?6849 ?0784 4104 6943 4149 2418 2345 5116 ,7119 0354 0055 3089 1835 ,5261 1783 0250 2601 0110 0171 ,6290 0138 4972 1421 0055 7820 0087 8010 0138 4104 ?1927 1927 ,076…

DDD理论学习系列(9)-- 领域事件

1. 引言 A domain event is a full-fledged part of the domain model, a representation of something that happened in the domain. Ignore irrelevant domain activity while making explicit the events that the domain experts want to track or be notified of, or whi…

ssl1127-方程的解数【HASH,dfs】

前言 我只是凑数的。 正题 输入输出&#xff08;建议无视&#xff09; Input 第1行包含一个整数n。第2行包含一个整数M。第3行到第n2行&#xff0c;每行包含两个整数&#xff0c;分别表示ki和pi。两个整数之间用一个空格隔开。第3行的数据对应i1&#xff0c;第n2行的数据对应…

自然语言处理中的Attention Model:是什么以及为什么[二]

转载自 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[二] 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[二] 1、Attention Model 图一见下&#xff1a; 图1中展示的Encoder-Decoder模型是没有体现出“注意力模型”的&#xff0c;所以可以…

SpringAOP之代理设计模式

[1]设计模式: 概念: 设计模式其实就是代码的一种结构的设计思路。 好处: 增加代码健壮性 易修改性 可扩展性 设计模式的种类: 三大种类: 建造类设计模式 结构类设计模式 行为类设计模式 参考网址: http://baijiahao.baidu.com/s?id1639156298714178350&wfrspider&forp…

教师节快乐!

点击上方蓝色关注我们&#xff01;今天是个特殊的节日&#xff0c;教师节&#xff0c;从昨天开始就有学生给我发教师节祝福了……诺&#xff0c;发就发了吧&#xff0c;还害羞&#xff01;早上一醒来&#xff0c;就看到同学们在群里发祝福&#xff0c;心理美滋滋的。还有直接改…

如何利用.NET Core搭建跨平台的控制台应用程序

尽管传统意义上来说&#xff0c;.NET是只面向Windows的、闭源的专有平台&#xff0c;然而&#xff0c;传统观念即将被颠覆。新的开源跨平台的.NET Core已经开启&#xff0c;意味着你可以在任意平台写C#或.NET&#xff0c;然后在Windows、Linus和macOS运行。 这个新的.NET平台正…

自然语言处理中CNN模型几种常见的Max Pooling操作

转载自 自然语言处理中CNN模型几种常见的Max Pooling操作 自然语言处理中CNN模型几种常见的Max Pooling操作 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型。 图1展示了在NLP任务中使用CNN模型的典型网络结构。 一般而言&#xff0c;输入的字或者词用…

SpringTX

文章目录SpringTX的介绍SpringTX的使用代码示例声明式事务中属性解释SpringBoot中AOP事务配置SpringTX的介绍 问题&#xff1a; 在学习了Spring整合mybatis后&#xff0c;我们可以直接从Spring容器中获取mapper层的实例化对象完成数据库操作。而在业务层方法中很多时候因为业务…

详细整理分层开发步骤!

不点蓝字&#xff0c;我们哪来故事&#xff1f;一、创建数据库&#xff0c;在数据库中创建表二、创建java项目&#xff08;起名要有意义&#xff0c;eg&#xff1a;petSys&#xff09;三、在项目中新建包&#xff0c;包名为&#xff1a;cn.bdqn.petSys.entity四、在cn.bdqn.pet…

.NET 跨平台界面框架和为什么你首先要考虑再三

现在用 C# 来开发跨平台应用已经有很成熟的方案&#xff0c;即共用非界面代码&#xff0c;而每个操作系统搭配特定的用户界面代码。这个方案的好处是可以直接使用操作系统原生的控件和第三方控件&#xff0c;还能够和操作系统深度集成。 这里的深度集成主要是指一些 Windows 专…

seq2seq中的beam search算法过程

转载自 seq2seq中的beam search算法过程 首先说明在sequence2sequence模型中&#xff0c;beam search的方法只用在测试的情况&#xff0c;因为在训练过程中&#xff0c;每一个decoder的输出是有正确答案的&#xff0c;也就不需要beam search去加大输出的准确率。 假设现在我…

Spring的properties属性配置文件和Spring常用注解

Spring的properties属性配置文件 问题: 在学习了Spring的知识后&#xff0c;需要被Spring管理的资源都是通过配置文件的形式来告诉Spring容器对象管理谁以及如何管理。但是随着使用次数的增多&#xff0c;我们发现配置文件中配置的标签越来越多&#xff0c;每次我们创建一个新…

即日起,正式进入编程世界!

点击上方蓝色关注我们&#xff01;从今天开始&#xff0c;正式进入编程世界。首先我们先从堪称“少儿编程”的Scratch开始&#xff0c;简洁的编辑窗口加上可读性较高的Chinese&#xff08;大部分的编程编辑器均为英文版&#xff09;&#xff0c;使得该软件特容易上手。班内总有…