<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Web API 依賴注入與擴展

      依賴注入

      與 MVC 類似, Web API 提供了System.Web.Http.Services.IDependencyResolver 接口來實現(xiàn)依賴注入, 我們可以很容易的用 Unity 來實現(xiàn)這個接口:

      public class UnityDependencyResolver : IDependencyResolver {
      
         private readonly IUnityContainer _container;
      
         public UnityDependencyResolver(IUnityContainer container) {
            this._container = container;
         }
      
         public object GetService(Type serviceType) {
            return this._container.IsRegistered(serviceType) ? this._container.Resolve(serviceType) : null;
         }
      
         public IEnumerable<Object> GetServices(Type serviceType) {
            return this._container.Registrations
                   .Where(reg => type.IsAssignableFrom(reg.RegisteredType))
                   .Select(reg => string.IsNullOrEmpty(reg.Name) ? this._container.Resolve(type) : this._container.Resolve(type, reg.Name));
         }
      
      }
      

      使用 UnityDependencyResolver 的方法也很簡單, 只要在 Global.asax.cs 里添加下面一行代碼即可:

      GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new UnityDependencyResolver(container));
      

      將 UnityDependencyResolver 配置好之后, Web API 框架將會在運行時向其請求一系列的接口實現(xiàn):

      1. 應(yīng)用啟動時, Web API 框架會依次請求下列接口:
        1. System.Web.Http.Dispatcher.IHttpControllerFactory
        2. System.Web.Http.Common.ILogger
        3. System.Web.Http.Dispatcher.IHttpControllerActivator
        4. System.Web.Http.Controllers.IHttpActionSelector
        5. System.Web.Http.Controllers.IHttpActionInvoker
      2. 在第一次訪問某個 Controller 之前, 還會請求下面的接口 (如果重復(fù)訪問相同的 Controller , 則不會再次調(diào)用):
        1. System.Web.Http.Filters.IFilterProvider
      3. 每次處理 HTTP 請求時, Web API 請求下列接口:
        1. System.Web.Http.Controllers.IActionValueBinder
        2. System.Web.Http.ValueProviders.ValueProviderFactory (僅 Action 需要參數(shù)時才需要)
        3. System.Web.Http.ModelBinding.ModelBinderProvider (僅 Action 需要參數(shù)時才需要)
        4. System.Web.Http.Metadata.ModelMetadataProvider (僅 Action 需要參數(shù)時才需要)
        5. System.Web.Http.Validation.ModelValidatorProvider (僅 Action 需要參數(shù)時才需要)
        6. System.Net.Http.Formatting.IFormatterSelector

      這些接口都是 Web API 公開的擴展點, 可以根據(jù)需要來對這些接口進行實現(xiàn), 并通過 Unity 進行配置, 讓其注入到 Web API 運行時中。 接下來將逐個討論這些擴展點。

      擴展

      IHttpControllerFactory

      IHttpControllerFactory 接口有兩個方法, 負責(zé)創(chuàng)建和銷毀 HttpController 實例:

      • CreateController(HttpControllerContext, Type) : IHttpController
      • ReleaseController(IHttpController) : void

      這個接口的默認實現(xiàn)是 DefaultHttpControllerFactory , 根據(jù)當(dāng)前請求的上下文通過創(chuàng)建 HttpControllerDescriptor , 然后通過 HttpControllerDescriptor 的 ControllerActivator 創(chuàng)建對應(yīng)的 IHttpController 實例。

      ILogger

      只是一個日志接口, 有下面的幾個方法:

      • Log(string, TraceLevel, Func) : void
      • LogException(string, TraceLevel, Exception) : void

      默認的實現(xiàn)是 DiagnosticLogger , 通過 ILSpy 觀察, 貌似什么都沒有做。

      IHttpControllerActivator

      負責(zé)創(chuàng)建具體的 Controller 實例, 只有一個方法:

      • Create(HttpControllerContext, Type) : IHttpController

      默認的實現(xiàn)是 DefaultHttpControllerActivator , 先向 DependencyResolver 請求對應(yīng) Controller 類型的實例, 如果返回為空, 則通過動態(tài)編譯包裝 Controller 類型構(gòu)造函數(shù)的 lambda 表達式進行創(chuàng)建實例, 相關(guān)的代碼如下:

      Func<IHttpController> func = TypeActivator.Create<IHttpController>(controllerType);
      Tuple<HttpControllerDescriptor, Func<IHttpController>> value = Tuple.Create<HttpControllerDescriptor, Func<IHttpController>>(controllerContext.ControllerDescriptor, func);
      Interlocked.CompareExchange<Tuple<HttpControllerDescriptor, Func<IHttpController>>>(ref this._fastCache, value, null);
      result = func();
      

      IHttpActionSelector

      負責(zé)選擇合適的動作, 默認的實現(xiàn)是 ApiControllerSelector , 選擇規(guī)則如下:

      1. 如果路由定義了 {action} , 則通過當(dāng)前的 HttpControllerContext 中的 action 的值尋找合適的方法;
      2. 否則, 根據(jù)當(dāng)前的 HTTP 請求方法 (POST, GET, PUT, DELETE) 尋找合適的方法。

      IHttpActionInvoker

      負責(zé)調(diào)用 HttpActionSelector 選擇到的方法, 該接口有一個方法:

      • InvokeActionAsync(HttpActionContext, CancellationToken) : Task<HttpResponseMessage>

      默認的實現(xiàn)是 ApiControllerActionInvoker , 通過反射找出動作方法的參數(shù)信息, 然后再通過動態(tài)創(chuàng)建 lambda 表達式對方法進行調(diào)用, 取得返回結(jié)果, 部分代碼如下:

      ParameterExpression parameterExpression = Expression.Parameter(typeof(object), "instance");
      ParameterExpression parameterExpression2 = Expression.Parameter(typeof(object[]), "parameters");
      List<Expression> list = new List<Expression>();
      ParameterInfo[] parameters = methodInfo.GetParameters();
      for (int i = 0; i < parameters.Length; i++)
      {
         ParameterInfo parameterInfo = parameters[i];
         BinaryExpression expression = Expression.ArrayIndex(parameterExpression2, Expression.Constant(i));
         UnaryExpression item = Expression.Convert(expression, parameterInfo.ParameterType);
         list.Add(item);
      }
      UnaryExpression instance2 = (!methodInfo.IsStatic) ? Expression.Convert(parameterExpression, methodInfo.ReflectedType) : null;
      MethodCallExpression methodCallExpression = Expression.Call(instance2, methodInfo, list);
      if (methodCallExpression.Type == typeof(void))
      {
         Expression<Action<object, object[]>> expression2 = Expression.Lambda<Action<object, object[]>>(methodCallExpression, new ParameterExpression[]
         {
            parameterExpression,
            parameterExpression2
         });
         Action<object, object[]> voidExecutor = expression2.Compile();
         return delegate(object instance, object[] methodParameters)
         {
            voidExecutor(instance, methodParameters);
            return null;
         }
         ;
      }
      UnaryExpression body = Expression.Convert(methodCallExpression, typeof(object));
      Expression<Func<object, object[], object>> expression3 = Expression.Lambda<Func<object, object[], object>>(body, new ParameterExpression[]
      {
         parameterExpression,
         parameterExpression2
      });
      return expression3.Compile();
      

      取得返回結(jié)果之后, 再調(diào)用 ApiResponseConverter 的 GetResponseConverter 方法找到合適的 Converter , 最后返回 Task<HttpResponseMessage>

      IFilterProvider

      負責(zé)提供過濾的標記, Web API 框架內(nèi)置了下面的幾個 FilterProvider :

      • EnumerableEvaluatorFilterProvider 負責(zé)提供對 IENumerable 的每個元素的轉(zhuǎn)換的標記, 簡單的說, 就是負責(zé)提供將 Action 方法返回的 IEnumerable 的結(jié)果進行自定義轉(zhuǎn)換的標記;
      • QueryCompositionFilterProvider 負責(zé)對 Action 方法返回的 IQueryable 的結(jié)果進行符合 OData 約定的 URL 參數(shù)進行再次過濾的標記 QueryCompositionFilterAttribute , 目前只支持 $filter 、 $orderby 、 $skip 以及 $top ;
      • ActionDescriptorFilterProvider
      • ConfigurationFilterProvider

      注意, 這里說的是 FilterProvider, 不是 Filter , 也不是 FilterAttribute 。

      IActionValueBinder

      負責(zé)綁定 Action 方法的參數(shù), 默認的實現(xiàn)是 DefaultActionValuebinder , 通過調(diào)用 ValueProviderFactory 、 ModelBinderProvider 進行參數(shù)綁定, 支持多種形式的參數(shù)綁定, 綁定策略比較復(fù)雜, 總的來說是簡單的參數(shù)從 URL 中綁定, 復(fù)雜參數(shù)從 HTTP 請求內(nèi)容中獲取。

      ValueProviderFactory

      定義了 Action 參數(shù)從哪里獲取, 有以下幾個實現(xiàn), 分別支持從 URI 、 QueryString、 Post 內(nèi)容中提取參數(shù)值:

      • CompositeValueProviderFactory
      • KeyValueModelProviderFactory
      • RouteDataValueProviderFactory
      • QueryStringValueProviderFactory

      ModelBinderProvider

      定義了如何將獲取到的 HTTP 請求的的參數(shù)之綁定到指定的參數(shù)。 System.Web.Http.ModelBinding.Binders 命名空間內(nèi)提供了多種 BinderProvider , 應(yīng)該可以處理大多數(shù)常見的類型。

      ModelMetadataProvider

      負責(zé)提供模型元數(shù)據(jù)描述信息。

      ModelValidatorProvider

      負責(zé)根據(jù)元素據(jù)信息對模型進行驗證。

      IFormatterSelector

      負責(zé)選擇合適的格式, 包括客戶端請求的格式以及服務(wù)端返回的格式, 默認實現(xiàn)是 FormatterSelector , 能夠提下面的 MediaFormater :

      • BufferedmediaTypeFormatter 提供對二進制格式的讀取與寫入;
      • FormUrlEncodedMediaTypeFormatter 提供對表單 URL 編碼格式的讀取與寫入;
      • JsonMediaTypeFormatter 提供對 Json 格式的讀取與寫入;
      • XmlMediaFormatter 提供對 XML 格式的讀取與寫入。
      posted @ 2012-03-22 13:40  張志敏  閱讀(10351)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产在线98福利播放视频| 国产农村老熟女乱子综合| 中国CHINA体内裑精亚洲日本| 激情久久av一区av二区av三区| 4虎四虎永久在线精品免费| 亚洲AV永久中文无码精品综合| 亚洲色一色噜一噜噜噜| 18禁黄网站免费| 天天爽天天摸天天碰| 国产av一区二区亚洲精品| 国产成人av大片大片| 99久久久国产精品免费无卡顿| 亚洲欧洲一区二区精品| 日韩精品区一区二区三vr| 国产精品沙发午睡系列990531| 黄色三级亚洲男人的天堂| 蜜臀av一区二区精品字幕| 亚洲精品成人区在线观看| 国内精品免费久久久久电影院97| 日本三级香港三级人妇99| 亚洲国产精品久久久天堂麻豆宅男| 免费全部高h视频无码| 成人永久性免费在线视频| 国产精品高清视亚洲中文| 国产一级r片内射免费视频| 亚洲国产日韩欧美一区二区三区| 欧美熟妇xxxxx欧美老妇不卡| 中文字幕免费一二三区乱码| 性欧美vr高清极品| 91精品91久久久久久| 精品视频在线观看免费观看| 成人无遮挡裸免费视频在线观看 | 精品人妻系列无码一区二区三区| 奇米四色7777中文字幕| 亚洲成人资源在线观看| 又色又爽又黄18禁美女裸身无遮挡| 精品少妇无码一区二区三批 | 欧美男男作爱videos可播放 | 99国产精品永久免费视频| 免费看成人毛片无码视频| 舟山市|