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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Controller的創(chuàng)建

2019-11-17 02:01:42
字體:
供稿:網(wǎng)友

Controller的創(chuàng)建

  在ControllerBuilder類中設(shè)置ControllerFactory,然后使用ControllerFactory創(chuàng)建Controller。 http請求在進入httphandler映射處理時,通過ControllerBuilder的Current獲取ControllerFactory,然后使用默認或者注冊的(如果注冊地話)ControllerFactory創(chuàng)建controller。默認的工廠是一個DefaultControllerFactory對象,由下面代碼可以看出。

internal ControllerBuilder(IResolver<IControllerFactory> serviceResolver){      ControllerBuilder controllerBuilder = this;      IResolver<IControllerFactory> resolver = serviceResolver;      if (resolver == null)        resolver = (IResolver<IControllerFactory>) new SingleServiceResolver<IControllerFactory>((Func<IControllerFactory>) (() => this._factoryThunk()),(IControllerFactory) new DefaultControllerFactory()        {          ControllerBuilder = this        }, "ControllerBuilder.GetControllerFactory");      controllerBuilder._serviceResolver = resolver; }

  而Controller的產(chǎn)生是通過DefaultControllerFactory的CreateController來實現(xiàn)的,代碼如下:

public virtual IController CreateController(RequestContext requestContext, string controllerName){      if (requestContext == null)        throw new ArgumentNullException("requestContext");      if (string.IsNullOrEmpty(controllerName))        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controllerName");      Type controllerType = this.GetControllerType(requestContext, controllerName);      return this.GetControllerInstance(requestContext, controllerType);}

  然后查看GetControllerType方法:

PRotected internal virtual Type GetControllerType(RequestContext requestContext, string controllerName){      if (string.IsNullOrEmpty(controllerName))        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controllerName");      object obj;      if (requestContext != null && requestContext.RouteData.DataTokens.TryGetValue("Namespaces", out obj))      {        IEnumerable<string> enumerable = obj as IEnumerable<string>;        if (enumerable != null && Enumerable.Any<string>(enumerable))        {          HashSet<string> namespaces = new HashSet<string>(enumerable, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);          Type withinNamespaces = this.GetControllerTypeWithinNamespaces(requestContext.RouteData.Route,                      controllerName, namespaces);          if (withinNamespaces != (Type) null || false.Equals(requestContext.RouteData.DataTokens["UseNamespaceFallback"]))            return withinNamespaces;        }      }      if (this.ControllerBuilder.DefaultNamespaces.Count > 0)      {        HashSet<string> namespaces = new HashSet<string>((IEnumerable<string>) this.ControllerBuilder.DefaultNamespaces,        (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);        Type withinNamespaces = this.GetControllerTypeWithinNamespaces(requestContext.RouteData.Route, controllerName, namespaces);        if (withinNamespaces != (Type) null)          return withinNamespaces;      }      return this.GetControllerTypeWithinNamespaces(requestContext.RouteData.Route, controllerName, (HashSet<string>) null);}

  可以看到最終都歸結(jié)到同一個方法GetControllerTypeWithinNamespaces中,代碼如下:

private Type GetControllerTypeWithinNamespaces(RouteBase route, string controllerName, HashSet<string> namespaces){      this.ControllerTypeCache.EnsureInitialized(this.BuildManager);      ICollection<Type> controllerTypes = this.ControllerTypeCache.GetControllerTypes(controllerName, namespaces);      switch (controllerTypes.Count)      {        case 0:          return (Type) null;        case 1:          return Enumerable.First<Type>((IEnumerable<Type>) controllerTypes);        default:          throw DefaultControllerFactory.CreateAmbiguousControllerException(route, controllerName, controllerTypes);      } }

  而方法EnsureInitialized()是通過IBuildManager獲取程序中所有實現(xiàn)了IController的類型,然后在這些類型里用路由數(shù)據(jù)或者ControllerBuilder中的命名空間和controller的名稱進行匹配,如果沒有匹配,返回null,如果有一個匹配,返回,如果有多個,拋出異常!

  現(xiàn)在獲取到了controllerType的類型,然后返回到工廠的CreateController的最后一步,查看GetControllerInstance方法,代碼如下:

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) {      if (controllerType == (Type) null)      {        throw new HttpException(404, string.Format((IFormatProvider) CultureInfo.CurrentCulture, MvcResources.DefaultControllerFactory_NoControllerFound, new object[1]        {          (object) requestContext.HttpContext.Request.Path        }));      }      else      {        if (typeof (IController).IsAssignableFrom(controllerType))          return this.ControllerActivator.Create(requestContext, controllerType);        throw new ArgumentException(string.Format((IFormatProvider) CultureInfo.CurrentCulture, MvcResources.DefaultControllerFactory_TypeDoesNotSubclassControllerBase, new object[1]        {          (object) controllerType        }), "controllerType");      } }

  可以看到,這個時候又使用到了另外一個對象ControllerActivator,由DefaultControllerFactory的構(gòu)造函數(shù)可以看出

internal DefaultControllerFactory(IControllerActivator controllerActivator, IResolver<IControllerActivator> activatorResolver, IDependencyResolver dependencyResolver) {      if (controllerActivator != null)        this._controllerActivator = controllerActivator;      else        this._activatorResolver = activatorResolver ?? (IResolver<IControllerActivator>) new SingleServiceResolver<IControllerActivator>((Func<IControllerActivator>) (() => (IControllerActivator) null),(IControllerActivator) new DefaultControllerFactory.DefaultControllerActivator(dependencyResolver), "DefaultControllerFactory constructor"); }

默認使用的是實現(xiàn)了接口IResolver<TService>的SingleServiceResolver<TService>對象默認注冊的一個內(nèi)部對象DefaultControllerActivator,然后調(diào)用它的create方法,代碼如下:

public IController Create(RequestContext requestContext, Type controllerType) {        try        {          return (IController) (this._resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));        }        catch (Exception ex)        {          throw new InvalidOperationException(string.Format((IFormatProvider) CultureInfo.CurrentCulture, MvcResources.DefaultControllerFactory_ErrorCreatingController, new object[1]          {            (object) controllerType          }), ex);        } }

  而DefaultControllerActivator對象中的屬性_resolverThunk是一個Func<IDependencyResolver> _resolverThunk委托對象,我們通過DefaultControllerFactory構(gòu)造函數(shù)中調(diào)用的new DefaultControllerFactory.DefaultControllerActivator(dependencyResolver),可以看到DefaultControllerActivator的構(gòu)造函數(shù)

public DefaultControllerActivator(IDependencyResolver resolver){        if (resolver == null)          this._resolverThunk = (Func<IDependencyResolver>) (() => DependencyResolver.Current);        else          this._resolverThunk = (Func<IDependencyResolver>) (() => resolver);}

  對它的設(shè)置,如果在自己實現(xiàn)的ControllerFactory的構(gòu)造函數(shù)中傳遞了自己定義的一個IDependencyResolver對象或者DependencyResolver的SetResolver方法設(shè)置了一個自定義的IDependencyResolver對象,就會使用它,如果沒有,則使用默認的DependencyResolver.Current,可以看到DependencyResolver.Current是一個實現(xiàn)了IDependencyResolver接口對象的引用,從他的構(gòu)造函數(shù)

public DependencyResolver(){      this.InnerSetResolver((IDependencyResolver) new DependencyResolver.DefaultDependencyResolver());}

  看出它使用的是一個內(nèi)部私有的對象DefaultDependencyResolver,

private class DefaultDependencyResolver : IDependencyResolver{      public object GetService(Type serviceType)      {        if (!serviceType.IsInterface)        {          if (!serviceType.IsAbstract)          {            try            {              return Activator.CreateInstance(serviceType);            }            catch            {              return (object) null;            }          }
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 津市市| 古丈县| 博爱县| 赤壁市| 海门市| 威信县| 廉江市| 常熟市| 五峰| 邢台县| 册亨县| 蚌埠市| 泊头市| 新邵县| 静乐县| 台东县| 樟树市| 微博| 加查县| 古田县| 韶关市| 鄯善县| 建德市| 宝鸡市| 鹤山市| 施秉县| 龙岩市| 孟津县| 府谷县| 丹阳市| 广州市| 长宁县| 宁乡县| 离岛区| 太仆寺旗| 城口县| 田东县| 海门市| 江川县| 凤凰县| 石门县|