首页 > 编程 > .NET > 正文

剖析ASP.NET MVC的DependencyResolver组件

2024-07-10 12:47:25
字体:
来源:转载
供稿:网友

一、前言

  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方法:

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();   //通过ControllerFactory获取Controller对象  controller = factory.CreateController(RequestContext, controllerName);}

  ControllerFactory故名思议就是用于创建Controller的,我们也可以自己实现IControllerFactory,参与Controller的激活过程,具体是在全局调用ControllerBuilder.Current.SetControllerFactory方法。我们这里主要关注的是Controller的激活过程,实际上它们的创建过程是相似的。默认使用的ControllerFactory是DefaultControllerFactory。DefaultControllerFactory的CreateController方法如下:  

public virtual IController CreateController(RequestContext requestContext, string controllerName){  //获取Controller类型  Type controllerType = GetControllerType(requestContext, controllerName);   IController controller = GetControllerInstance(requestContext, controllerType);  return controller;} protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType){  return ControllerActivator.Create(requestContext, controllerType);}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表