2019-03-22 17:33 by 韩俊俊, ... 阅读, ... 评论, 收藏, 编辑
一丶前言
下面是本人对于 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 谢谢了. https://github.com/HanJunJun/Titan.Blog.webAPP
演示地址: http://gaobili.cn:8600/swagger/index.html http://gaobili.cn:8600/swagger/index.html
来源: https://www.cnblogs.com/HanJunJun-blog/p/10579712.html