上篇文章中,举了一个Autofac的简单例子,园友eflay反应:

“虽然对autofac架构原理还是完全不懂,不过基本是明白ioc的用途了,会从已注册的类中找出符合接口的类来调用构造函数进行构造”

所以这篇文章,还是针对上次的例子,不引用Autofac,完全使用自己写的FakeAutofac, 也让Demo运行起来.

由于本篇文章和以前文章关联度很高,源代码也是从以前的演化过来的。没有看过以前文章的园友,麻烦移步这里, 下载第二篇的源代码,思考一下如何实现例子中Autofac使用到的功能。

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc

IoC容器Autofac(2) - 一个简单示例(附demo源码)

这里是本文相关的源代码 AutofacDem0(1).zip, 源代码主要涉及的知识有反射,泛型,委托。

这篇文章本人没有把握能够把所有的东西都讲的非常浅显易懂, 不过好在有源代码, 代码量不大,加有很多注释,大家可以对比理解一下。

如果对源代码有任何建议和问题,可以留言或者写在评论里,我尽量回复和解答。

阅读目录:

一. 开始前的分析

二. 实现过程中遇到的一些难点

三. 总结

一、开始前的分析

我们主要使用到了Autofac中的类和方法:

类ContainerBuilder中的方法:

RegisterType<T>()//注册类型T

AsImplementedInterfaces()//表示注册的类型,以接口的方式注册

Build()//创建一个容器

接口IContainer的方法:

Resolve<T>()//从容器中取出一个T类型的实例

这里是类图:

二、实现过程中遇到的一些难点

注册类型可以使用集合类来保存,当需要某种类型的实例的时候,可以使用反射调用构造函数直接构造该类型的实例。

这样看起来还蛮简单的,但是还有一些难点, 大家在看源代码的过程中,可以带着这些问题看看是如何解决这些问题的。

1. 如何实现AsImplementedInterfaces()方法?

这个方法的作用是,指定注册类型以接口形式存在, 比如,

当我运行了下面代码后

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces(); //以类ListMovieFinder的接口IMovieFinder注册

那么我使用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个ListMovieFinder的实例

2. 如何实现对同一个类型的注册,后面的覆盖前面的注册, 如源代码中:

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces();
builder.RegisterType<DBMovieFinder>().AsImplementedInterfaces();

后面的DBMovieFinder会覆盖掉ListMovieFinder的注册

这样,当我调用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个DBMovieFinder的实例

3.当用反射调用构造函数的时候,如果构造函数中有参数,这些参数也由Autofac构造。

比如,当我们Resolve<MPGMovieLister>()想获取MPGMovieLister实例的时候, MPGMovieLister的构造函数需要一个IMovieFinder类型的参数,如何这个参数也由Autofac创建?

三、总结

源代码只是模仿Autofac的一部分功能,只能算是Autofac现有功能中的九牛一毛了。

直接使用别人写好的框架,自然是最简单不过的。 但是通过自己动手写源代码模仿Autofac的实现,自己学到更多,同时写非常感谢那些做开源框架和产品的开发者。

感谢园友eflay, 因为这个,我才有了这个想法,期间几次想放弃写这篇文章,但是"知其然还要知其所以然"的想法又让我坚持了下去。

希望源代码和文章能够对大家有所帮助。

本文相关源代码: AutofacDem0(1).zip

相关文章:

IoC容器Autofac(2) - 一个简单示例(附demo源码)

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc

理解为什么要使用Ioc

分析Autofac如何实现Controller的Ioc(Inversion of Control)

本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/archive/2013/03/24/2978597.html,如需转载请自行联系原作者

IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)相关推荐

  1. SHA3系列(KECCAK)哈希算法原理及实现(附源码)

    相关文章: (本文持续更新中) SHA3系列(KECCAK)哈希算法原理及实现(附源码) SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM ...

  2. linux直流电机测试,带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)...

    查看: 14294|回复: 83 带霍尔传感器编码器的直流减速电机测速原理讲解(附源码) 高级会员, 积分 891, 距离下一级还需 109 积分 积分金钱891 注册时间2019-4-22 在线时间 ...

  3. [vue] 你了解axios的原理吗?有看过它的源码吗?

    [vue] 你了解axios的原理吗?有看过它的源码吗? 1.axios通过对Promise的封装实现异步请求: 2. if(answer == '有'){ if(这个问题到此为止){ return ...

  4. SHA224和SHA256哈希算法原理及实现(附源码)

    相关文章: SHA224和SHA256哈希算法原理及实现(附源码) 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理 ...

  5. 国密SM3密码杂凑算法原理及实现(附源码)

    相关文章: 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理及实现(附源码) MD2哈希算法原理及实现(附源码) M ...

  6. 通过路由器或服务器实现多路由多网络接入网路传输提速详细实现(附源码),五万字搞懂双路由、旁路由、分布式路由、CN2线路、IPLC线路、BGP线路的原理和实现

    通过路由器或服务器实现多路由多网络接入网路传输提速详细实现(附源码),搞懂双路由.旁路由.分布式路由.CN2线路.IPLC线路.BGP线路的原理和实现. 双wan口路由器如何实现双线接入(双wan口路 ...

  7. SHA512系列哈希算法原理及实现(附源码)

    相关文章: SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈 ...

  8. 关于Spring中IOC容器和AOP协同工作的原理理解

    1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...

  9. 【并发编程系列6】Condition队列原理及await和singal(等待/唤醒)机制源码分析

    Condition队列原理分析 前言 初识Condition Condition使用示例 Condition原理分析 condition.wait()源码解读 AQS#await() AQS#addC ...

最新文章

  1. Error:java: 错误: 不支持发行版本 14
  2. 请给出一个算法,使之对于给定的介于0到k之间的n个整数进行预处理,并能在O(1)时间内,回答出输入的整数中有多少个落在区间[a..b]内,你给出的算法上预处理时间应是O(n+k)。...
  3. 使用Docker部署Node.js中的Vue项目
  4. log4net报错集
  5. 信息系统项目管理师:第5章:项目范围管理-重点汇总
  6. GRUNT----JSHINT
  7. 古人把月球叫做广寒宫,古人是怎么知道月球上很冷的?一起来看看
  8. Jquery设置select控件指定text的值为选中项
  9. 浙江省单考单招计算机提前招,2018浙江省各校高职提前招生简章汇总及深度解析...
  10. WordPress 简约主题 NDNAV 网址导航网站模版
  11. eps如何建立立体白模_EPS 三维测图系统(垂直摄影)快速入门手册.pdf
  12. Java中文乱码详解
  13. 【计算方法】数值积分
  14. 计算机水平考试模块数量,职称计算机考试科目、模块数量是什么
  15. 计算机网络(3)宽带接入技术
  16. matlab里的pid参数调节,pid调节的方法
  17. 生信宝典:生物信息学习系列教程、视频教程
  18. Centos系统如何开启关闭防火墙
  19. 博客9-16CSS 三大特性
  20. adguard自定义_AdGuardHome拦截页面模版下载,自定义AdGuardHome拦截页教程,修改AdGuardHome默认拦截页...

热门文章

  1. Notes客户端重新配置批处理
  2. 用Scikit-learn和TensorFlow进行机器学习_1
  3. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)
  4. SQL数据库无法附加 823错误修复 连接中断
  5. 【MVVM Light】新手初识MVVM,你一看就会
  6. 【7.6.3】基于每个具体类一张表的继承映射
  7. C# 操作Cookie类
  8. 使用websploit在局域网全自动渗透
  9. 提高工作效率:15个有用的项目管理工具
  10. C#创建一个Windows Service