上文说到Routing Module将控制权交给了MvcHandler,因为MvcHandler实现了IHttpAsyncHandler接口,因此紧接着就会调用 BeginProcessRequest方法,这个方法首先会进行一些Trust Level之类的安全检测,暂且不谈,然后会调用ProcessRequestInit方法(有删节):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
首 先会获得controller的名字,然后会实例化controller,这里采用了抽象工厂的模式,首先利用ControllerBuilder获得一 个IControllerFactory的实例,ControllerBuilder采用Dependency Injection来实例化IControllerFactory,关于MVC中DI的实现以后另文介绍,在默认情况 下,ControllerBuilder会返回一个实例。接着调用CreateController方法:
1 2 3 4 5 |
|
方法分为两步,先获得类型,再获得实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
DefaultControllerFactory 在根据路由信息查找对应Controller的类型的时候,首先判断DataToken中有没有Namespace,然后调用 GetControllerTypeWithinNamespaces 方法查找Controller对应的类。先看下这个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
ASP.NET 中大量的用到了反射,因此也需要把这些反射出的类进行缓存以提高性能,首先看下EnsureInitialized这个比较有意思的方法,这个方法的参数 BuildManager经过了层层包装,其实只是System.Web.Compilation.BuildManager的一个实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
首先TypeCacheUtil获得所有是Controller的类型。TypeCacheUtil在前文已经出现过,用来获取所有的AreaRegistration的子类型,这里仔细看下这个方法:
发表回复