zoukankan      html  css  js  c++  java
  • 我记录开源系统1.6源码解析(二)

    上一篇我们主要把

    wojilu.Web.Mvc.MvcFilterLoader.Init();

    这行代码深入分析了下,遗留的问题如下:

    1.在遍历mvc过滤器的每一项时,里面涉及到的初始化DI注入没有详细的解析,感觉比较模糊,因为InitInject函数中涉及到的内容比较多。

    2.过滤器的Process方法还不知道是干嘛的。

    3.MvcEventPublisher:Mvc处理流程中的事件发布者,也不知道是干嘛的。

    这篇我们就先把第一个问题给解决。那我们就回到ObjectContext这个IOC管理容器来,不明白IOC的可以到

    http://baike.baidu.com/view/146665.htm 查看它的基本概念:

    IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一

    个组件需要哪一项服务。容器负责将这些联系在一起。

    ObjectContext类里一眼望去静态函数和静态成员比较多,还包含一些私有成员,这里我们主要研究它的GetByType函数。

    它有二个重载:

    public static Object GetByType( String typeFullName )
    public static Object GetByType( Type t )

    系统注明了都是 从缓存中取对象(有注入的就注入,没有注入的直接生成),结果是单例。

    这里我们看第一个函数,包含三行代码,最后一行调用第二个函数,都返回Object类型。

    我们着重看第一个函数中的Instance变量,它是ObjectContext的实例(单例),里面就是最主要的InitInject方法

    private static void InitInject( ObjectContext ctx ) {
                loadAssemblyAndTypes( ctx );
                resolveAndInject( ctx );
                addNamedObjects( ctx );
            }

    它干了三件事情:第一件比较简单,加载在web.config内的key为InjectAssembly的程序集,然后把它加ObjectContext

    的TypeList中。

    第二件事比较复杂,简单的说是把已经解析过的类型放到ObjectContext的ResolvedMap属性中。里面涉及到的一个类

    /// <summary>
        /// 依赖注入中的配置项
        /// </summary>
        public class MapItem : CacheObject

    关键就是

    List<MapItem> maps = cdb.findAll<MapItem>();

    这句代码做的什么工作呢? 查询在 /framework/data/ 目录下MapItem类型全称的配置文件中的以Json格式存储的数据

    我们看看到底是什么

    [    
        { Name:"contextInit", Type:"wojilu.Web.Context.ContextInit" }    
    ]

    这里只包含以contextInit为Name的一项。

    resolveAndInject随后就对它

    logger.Info( "resolve item begin..." );
    resolveMapItem( maps, resolvedMap, ctx );
    
    logger.Info( "inject Object begin..." );
    injectObjects( maps, resolvedMap );

    其实里面还涉及到很多的操作,包括MemoryDB类里的函数调用,Json的数据操作等等。。以后再一一解析。

    我们来看看wojilu.Web.Context.ContextInit类

    public class ContextInit : ContextInitBase

    位于wojilu.core项目中,我们将在后续为您解析该类,从名字上可以看出些,就是对运行上下文的初始化。

    好,我们回到addNameObjects这个函数上来,这个就比较简单,就是把resolveAndInject的ResolvedMap附给

    ObjectContext的ObjectsByName。

  • 相关阅读:
    左孩子右兄弟的字典树
    UVA 1401 Remember the Word
    HDOJ 4770 Lights Against Dudely
    UvaLA 3938 "Ray, Pass me the dishes!"
    UVA
    Codeforces 215A A.Sereja and Coat Rack
    Codeforces 215B B.Sereja and Suffixes
    HDU 4788 Hard Disk Drive
    HDU 2095 find your present (2)
    图的连通性问题—学习笔记
  • 原文地址:https://www.cnblogs.com/johnwonder/p/2322115.html
Copyright © 2011-2022 走看看