热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大话DI依赖注入+IOC控制反转(二)之浅析.NetCore中的DI与IOC

大话DI依赖注入+IOC控制反转(二)之浅析.NetCore中的DI与IOC    转发时请注明原创作者及地址,否则追究责任。原创:alunchen在上一篇文章中,我们聊了很多关于
大话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。电话筒是作为电话的一个属性。

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

     

      然后,我们创建容器并且从容器中获取对象。

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

 

      从上面,我们可以打印到Phone的信息,并且也能打印Microphone的信息。因为我们把两个对象都放入到了容器集合中。

      在上面的例子中,Microphone是作为构造参数,被依赖于Phone中。这种注入,称为构造器注入。而且在.Net Core中,只有这种依赖方式。还有其它的依赖方式,如方法注入、属性注入。

      那么,为什么在.Net Core中只有构造器注入呢?因为在所有注入方式来说,构造器注入是最正宗的注入。好处在于:保证依赖不可变、保证依赖不可空、避免了循环依赖、提升了代码的可复用性。

      并不是说构造器注入是万金油,也有些情况需要用属性注入等方式。所以,后面的注入方式.Net Core迟早要加入。

 

构造器注入选择                                   

      在.Net Core中,构造器注入的选择都是选择最多参数的,并且此参数都属于容器中。

      要证明上面的观点,我们做下面最经典的例子来说明。

 

创建3个类,分别为A、B、C。C类依赖与A与B,如下:

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

 

初始化容器,并取出C类。

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

 

      我们可以看到控制台打印:【in a b】。

      所以,验证了上面的观点。使用构造注入时,使用构造参数最多,并且参数都属于容器中的构造器。

 

总结

      上面浅析了DI与IOC在.Net Core中的应用。介绍了三种不同的生命周期与场景,使用构造器注入时.Net Core的选择。

 

可以关注本人的公众号,多年经验的原创文章共享给大家。

   大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

posted on 2018-11-05 15:31 alun-chen 阅读(...) 评论(...) 编辑 收藏


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
author-avatar
随便他们好了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有