上一篇我们主要把
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。