• 我记录开源系统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。

  • 相关阅读:
    ajax_注册
    mysql 二
    mysql基础
    django数据库批量创建
    私有属性
    mysql操作
    @property @classmethod @staticmethod
    python中的__new__方法
    员工信息表-装逼版
    三级菜单
  • 原文地址:https://www.cnblogs.com/johnwonder/p/2322115.html
Copyright © 2020-2023  润新知