国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

剖析ASP.NET MVC的DependencyResolver組件

2024-07-10 12:47:25
字體:
供稿:網(wǎng)友

一、前言

  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);}            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵寿县| 安塞县| 抚宁县| 石渠县| 通渭县| 博白县| 玛沁县| 龙南县| 竹溪县| 嵊泗县| 瑞金市| 六安市| 丹江口市| 天峻县| 牟定县| 增城市| 建德市| 乌兰浩特市| 夹江县| 分宜县| 军事| 商城县| 阿尔山市| 平乡县| 衡阳市| 富锦市| 类乌齐县| 阳泉市| 金坛市| 启东市| 逊克县| 盖州市| 克山县| 睢宁县| 镇原县| 巴南区| 德州市| 客服| 灵宝市| 元阳县| 阿合奇县|