zoukankan      html  css  js  c++  java
  • IoC容器Autofac(3) 理解Autofac原理,我实现的部分Autofac功能(附源码)

    上篇文章中,举了一个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)

  • 相关阅读:
    【JZOJ5771】遨游【二分】【DFS】
    【JZOJ5773】简单数学题【数论,数学】
    【JZOJ5773】简单数学题【数论,数学】
    有效壳第2部分:成为一个剪贴板体操运动员
    具有多重选择和列表间拖拽的拖拽列表框
    将枚举绑定到下拉列表框并根据值对其排序
    一个具有子项格式的自定义绘制列表控件
    基本的c#屏幕截图应用程序
    将组合框下拉列表宽度调整为最长字符串宽度
    在应用程序中使用按钮控件
  • 原文地址:https://www.cnblogs.com/JustRun1983/p/2978597.html
Copyright © 2011-2022 走看看