一、前言
DependencyResolver是MVC中一个重要的组件,从名字可以看出,它负责依赖对象的解析,可以说它是MVC框架内部使用的一个IOC容 器。MVC内部很多对象的创建都是通过它完成的,或许我们平时没有直接用到它,但是如果你在使用unity、autofac,或者在看一些开源项目时,总 会看到它的身影。接下来就让我们看一下这个组件是如何工作的。
二、通过Controller的激活理解DependencyResolver的工作过程
这里先插一个题外话,经常会有面试问:asp.net 几个核心对象是什么?一般人都会回答:Server、Request、Response、Session、Cookie这些。但我的回答会是 HttpApplication、HttpHandler和HttpModule,这才是管道模型中的核心类型,整个asp.net的处理流程和可扩展性 也都是建立在这几个对象上的。
回到主题,asp.net请求都是交给HttpHandler处理的,对于MVC来说,是交给一个MvcHandler,它负责激活Controller,如果你不知道为什么,请看这里。在这里我们直接定位到MvcHandler的PR方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
{ IController controller;
IControllerFactory factory;
ProcessRequestInit(httpContext, out controller, out factory);
//其它操作
//调用 controller.Execute方法
} private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{ HttpContext currentContext = HttpContext.Current;
//从路由获取controller名称
string controllerName = RequestContext.RouteData.GetRequiredString( "controller" );
//通过ControllerBuilder获取ControllerFactory,默认就是DefaultControllerFactory
factory = ControllerBuilder.GetControllerFactory();
|