欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于IOC容器的一些个人理解

程序员文章站 2022-03-20 09:33:23
一丶前言 下面是本人对于IOC容器的一些个人理解,希望能帮到初学者认识IOC,如有理解得不对的地方欢迎指正,也让我学学。 二丶IOC是什么,它是干嘛的? IOC只是一种编程思想,不局限于任何一种语言,任何语言都可以实现这种编程思想。它的设计思想是想把创建对象,管理对象生命周期,程序集之间的解耦的工作 ......

一丶前言

  下面是本人对于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使用流程图

关于IOC容器的一些个人理解

四丶autofac使用流程例子

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

关于IOC容器的一些个人理解

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

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

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

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

关于IOC容器的一些个人理解

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

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

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

关于IOC容器的一些个人理解

关于IOC容器的一些个人理解

 

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

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

 

六丶结语

 

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

 

五丶github demo,演示地址

 

demo 源码地址,顺便给个star谢谢了。