代码改变世界

我记录开源系统1.6源码解析(二)

2012-01-13 23:20  爱研究源码的javaer  阅读(297)  评论(0编辑  收藏  举报

上一篇我们主要把

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。