一丶前言

  下面是本人对于IOC容器的一些个人理解,希望能帮到初学者认识IOC,如有理解得不对的地方欢迎指正,也让我学学。

二丶IOC是什么,它是干嘛的?

  IOC只是一种编程思想,不局限于任何一种语言,任何语言都可以实现这种编程思想。它的设计思想是想把创建对象,管理对象生命周期,程序集之间的解耦的工作交给第三方容器来处理。传统的方式都是自己new一个对象,然后在写一个公共类去维护这个对象的生命周期,例如单例对象,static静态对象,同一个HTTP请求使用同一个对象等等,这些功能如果不用ioc容器组件,那就要自己写代码实现。

用了IOC组件之后这些操作就交由第三方ioc容器组件来处理,你只需要把对象塞进容器里,并告诉容器这个对象的生命周期就可以了。这种思想是符合未来发展趋势,专业的事交给专业的人来做,分工明确。

IOC是思想,实现这个思想的组件有Autofac,Castle Windsor,Unity,Spring.NET,StructureMap,Ninject,他们的功能类似,我用的最多的是Autofac和StructureMap,推荐使用Autofac,StructureMap作者很久没有更新了,下面文章的例子也是用Autofac来实现的。

三丶IOC容器Autofac使用流程图

四丶Autofac使用流程例子

  1.注册对象到容器中的流程:

这里有个要注意的地方,如果判断自己注册对象是否真正的在容器中了,这个可以用上面的方法,查询容器中是否包含了指定名字,如果查询到了说明你注册成功了。

如果这里没注册不成功,你在构造中注入会报错,上面的方法可以帮助你排查问题。

  2.从容器中取出对象使用的流程

这里使用的是构造函数注入:

扯一下,为啥必须EF在同一次请求里或者是同一个线程里必须用同一个EF上下文:

同一次请求可能包含对数据库的不同操作,其他的EF对象内获取的数据可能已经是过时的,如果不保证同一个请求中使用同一个EF上下文对象,事务工作单元模式将无法实现。而且可能造成数据混乱。

五丶如何验证对象的生命周期

你们会看到同时两个请求,guid会来回切换,因为他们所处的线程上下文在切换,下次请求guid还是一个新的,这个证明了这个ef上下文是同一个请求中使用的是同一个对象,说明注册的生命周期是有效的。

这个例子可能不那么直观,你们可以自己注册一个单例对象,或者静态对象测试一下就明白了。

六丶结语

  依赖注入,控制反转感觉没啥讲的,理解上面的ioc容器是啥东西,他能干嘛,使用ioc容器已经没啥问题了,等我有空再把AOP切面编程和ioc解耦说下我个人的理解。

五丶Github Demo,演示地址

Demo 源码地址,顺便给个Star谢谢了。

演示地址:http://gaobili.cn:8600/swagger/index.html

加群一起学习共同进步。群号:963718093

关于IOC容器的一些个人理解的更多相关文章

  1. 初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)

    我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? 毕竟,对自己的收入的分配差不多体现了自己的 ...

  2. 初始化IoC容器(Spring源码阅读)

    初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...

  3. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  4. 基于nutz框架理解Ioc容器

    同样我们从问题入手去验证以及去理解Ioc容器都做了哪些事情: 1.nutz是有几种方式获取需要容器管理bean的信息? 第一种是使用json格式的文件进行配置,如: 第二种:使用注解@IocBean ...

  5. 深入理解DIP、IoC、DI以及IoC容器(转)

    深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...

  6. 【转】深入理解DIP、IoC、DI以及IoC容器

    原文链接:http://www.cnblogs.com/liuhaorain/p/3747470.html 前言 对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有 ...

  7. 再看IOC, 读深入理解DIP、IoC、DI以及IoC容器

    IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合.控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模 ...

  8. IOC容器在web容器中初始化过程——(二)深入理解Listener方式装载IOC容器方式

    先来看一下ContextServletListener的代码 public class ContextLoaderListener extends ContextLoader implements S ...

  9. Spring学习(一):理解IoC容器

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

随机推荐

  1. 痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M文件那些事>系列文章之后,痞子衡休整了一小段时间,但是讲课的 ...

  2. Perl处理和收走子进程(退出状态码和wait)

    本文关于处理子进程退出状态码的内容主体来自于<Pro Perl>的第21章. 子进程退出状态码 每个子进程在退出时,操作系统都会保留它们的退出状态码,并在内核维护的进程表中保留子进程项.对 ...

  3. 如何正确使用Java泛型

    前言 Java 1.5之前是没有泛型的,以前从集合中读取每个对象都必须先进行转换,如果不小心存入集合中对象类型是错的,运行过程中转换处理会报错.有了泛型之后编译器会自动帮助转换,使程序更加安全,但是要 ...

  4. webpack4.0各个击破(6)—— Loader篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  5. 服务器SSH连接时间设置

    用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,造成这个问题的原因便是SSH服务有自己独特的会话连接机制. 解决方案: 1.设置服务器向SSH客户端连接会话发送频率和时间 v ...

  6. 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)

    在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...

  7. C#之Invoke学习

    C#中invoke和beginInvoke的使用 1.Control类中的invoke和beginInvoke的定义 invoke的含义是:在拥有此控件的基础窗口句柄的现呈上同步执行指定的委托(同步) ...

  8. Mysql中的WITH ROLLUP用法

    1.WITH ROLLUP:在group分组字段的基础上再进行统计数据. 例子:首先在name字段上进行分组,然后在分组的基础上进行某些字段统计,表结构如下: CREATE TABLE `test` ...

  9. Javascript继承3:将优点为我所有----组合式继承

    //声明父类 function ParentClass(name){ //值类型公有属性 this.name = name //引用类型公有属性 this.books = ['Html'] } //父 ...

  10. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...