一、前言
DependencyResolver是MVC中一個重要的組件,從名字可以看出,它負責依賴對象的解析,可以說它是MVC框架內(nèi)部使用的一個IOC容器。MVC內(nèi)部很多對象的創(chuàng)建都是通過它完成的,或許我們平時沒有直接用到它,但是如果你在使用unity、autofac,或者在看一些開源項目時,總會看到它的身影。接下來就讓我們看一下這個組件是如何工作的。
二、通過Controller的激活理解DependencyResolver的工作過程
這里先插一個題外話,經(jīng)常會有面試問: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); //其它操作 //調(diào)用 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故名思議就是用于創(chuàng)建Controller的,我們也可以自己實現(xiàn)IControllerFactory,參與Controller的激活過程,具體是在全局調(diào)用ControllerBuilder.Current.SetControllerFactory方法。我們這里主要關(guān)注的是Controller的激活過程,實際上它們的創(chuàng)建過程是相似的。默認使用的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);}
新聞熱點
疑難解答
圖片精選