xml地图|网站地图|网站标签 [设为首页] [加入收藏]

mvc控制器激活全分析

来源:http://www.ccidsi.com 作者:集成介绍 人气:92 发布时间:2019-05-04
摘要:asp.netmvc5框架揭秘壹书中详尽说了三个可开始展览的地方就是如上的讲述。下面的描述就是自个儿自身看源码以及资料的二个计算,当你看MVC源码的时候,你会有和煦的拿走,作者也并

<<asp.net mvc5框架揭秘>>壹书中详尽说了三个可开始展览的地方就是如上的讲述。下面的描述就是自个儿自身看源码以及资料的二个计算,当你看MVC源码的时候,你会有和煦的拿走,作者也并未有任何铺开来,仅仅就是友善的体会笔记。

            Ioc.RegisterType<IUserService, UserService>();            DependencyResolver.SetResolver(new IocDependencyResolver;
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}

如上的几个类是调节器激活最关键的类。差不离说说经过,备忘,当然也说不绝于耳多具体,有个大约思路就好,网莺时经重重介绍的稿子了。DefaultControllerFactory并不是构造调节器的地点,调节器的组织实在ControllerBuilder中,具体涉及到SetControllerFactory以及GetControllerFactory七个法子,我们得以通过SetControllerFactory来拓展自个儿的IOC容器,那是第三个可供拓展点。
DefaultControllerActivator类用来激活调节器,大家一般成立和煦的MVC框架的时候,都以在这几个类达成的ICOntrollerActivator接口的Create方法中,通过得到的调控器对象使用反射来创设调整器实例。当然这是在我们协和创制自身的MVC框架以及不行使第二方IOC容器的时候,正是应用该格局来制造的,而在MVC框架中,调节器实例的创造是延迟到了efaultDependencyResolver类中。这也是第三个可进展的地点,我们能够在第一方IOC容器中,完成IControllerActivator接口来创设调节器对象。
DefaultDependencyResolver类完毕了IDependencyResolver接口,私下认可的MVC框架达成的IOC容器(基于DI形式)设计的容器。大家就是在此间构造了大家的IOC容器,然则通过翻阅源码你会开掘,该IOC容器源码其实正是暗中同意使用反射来创立调节器对象。那与地点的DefaultControllerActivator类的效应是同样的。能够参见源码:

  私下认可DependencyResolver.Current使用的是DefaultDependencyResolver品种,这里又和ControllerFactory和ControllerActivator的设计同样了,假诺大家自定义,那么就选取,不然就使用默许的。DefaultDependencyResolver定义如下:

   能够看来,MVC会将Controller对象的成立通过DependencyResolver达成。将对象的成立通过 DependencyResolver实现的功利是足以降低对象间的耦合度;其余,通过落到实处IDependencyResolver接口,大家能够完全调整对象的成立进度,举例将目标的正视关系转移到安插文件中等等。

能够观察上边的try语句里面包车型地铁代码,通过调用GetService()方法,私下认可使用MVC本身的IOC容器(即DefaultDependencyResolver类)。在此处大家能够依照第贰方的IOC来进行大家本身的设计逻辑,那也是第多少个可拓展点。

  实际上,上边的例证大家也足以用完结IControllerFactory或许IControllerActivator达到一样的目的,但使用IDependencyResolver会更简Bellamy(Bellamy)点,而且大多数的IOC框架都曾经提供了这么的功效。比方地点UnityDependencyResolver根本不用自身定义,Unity for MVC 已经有如此三个类型了,直接利用就能够。假若利用Autofac的话能够是:DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

  HomeController只依赖于IUserService接口,不依赖于现实目的。

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

2、通过Controller的激活精通DependencyResolver的劳作进度

  ControllerFactory故名思议就是用来成立Controller的,我们也得以自身实现IControllerFactory, 出席Controller的激活进程,具体是在全局调用ControllerBuilder.Current.SetControllerFactory 方法。我们这里主要关怀的是Controller的激活进程,实际上它们的开创进度是一般的。暗许使用的ControllerFactory是DefaultControllerFactory。DefaultControllerFactory的CreateController方法如下:  

调控器的激活私下认可意况下利用反射来落到实处的,这里面使用了DI,单例等设计形式。对于调控器的要害涉及到如下的类:
ControllerBuilder、DefaultControllerFactory、DefaultControllerActivator(达成了IControllerActivator接口)、DependencyResolver(并未达成IDependencyResolver,可是有那几个接口对象实例)、DefaultDependencyResolver(实现了IDependencyResolver接口,暗许使用此类来分析调控器对象)

一、前言

   这里先插1个题外话,平常会有面试问:asp.net 多少个宗旨目标是哪些?平凡人都会回复:Server、Request、Response、Session、Cookie这几个。但自身的回答会是 HttpApplication、HttpHandler和HttpModule,那才是管道模型中的大旨类型,整个asp.net的管理流程和可增添性 也都以身无寸铁在那些对象上的。

  能够看来,它通过叁个ControllerActivator来创建IController对象,暗许使用的是DefaultControllerActivator。与ControllerFactory类似,大家得以达成IControllerActivator,加入Controller的激活进程,具体是将ControllerActivator作为DefaultConrtollerFactory构造函数参数,然后再在全局调用ControllerBuilder.Current.SetControllerFactory方法。能够见见MVC的Controller激活进度是很灵巧的,它提供种种主意让大家自定义激活进程。DefaultControllerActivator定义如下:

  回到核心,asp.net请求都以交由HttpHandler管理的,对于MVC来讲,是提交一个MvcHandler,它担任激活Controller,如若你不清楚为何,请看这里。在此处我们一直定位到MvcHandler的PXC90方法:

皇家国际娱乐中心,  通过地方我们还掌握了有二种暗许类型:DefaultControllerFactory、DefaultControllerActivator和DefaultDependencyResolver,分别对应四个接口:IControllerFactory、IControllerActivator、IDependencyResolver。它们的宏图是类似的,都是提必要外部多个接口,倘使外部自身落成了那个历程,那么就使用,不然用暗中同意的。实际上那也是我们参加Controller激活进程的三种做法。

享用源码学习:

  这里先插3个题外话,平日会有面试问:asp.net 多少个着力目的是什么?平常人都会回复:Server、Request、Response、Session、Cookie这几个。但自身的答应会是HttpApplication、HttpHandler和HttpModule,那才是管道模型中的核心类型,整个asp.net的拍卖流程和可扩充性也都是确立在那多少个目的上的。

   这里供给看清 (serviceType.IsClass && !serviceType.IsAbstract) || Ioc.IsRegistered(serviceType) 原因是大家前边说过的,MVC内部诸多目的都以由此DependencyResolver组件制造的,如上边的IConrtollerFactoy,所以 这里大家只担当对已注册的类型或类(非抽象类)进行辨析。

  能够见见,MVC会将Controller对象的创设通过DependencyResolver完结。将对象的开创通过DependencyResolver落成的益处是足以减低对象间的耦合度;别的,通过落成IDependencyResolver接口,我们能够完全调节目标的创办进度,举个例子将目的的信赖关系转移到安顿文件中等等。

  这里的_resolverThunk是三个用以获取IDepencyResolver对 象的委托,实际获得的是DependencyResolver.Current。我们也足以团结落成IDependencyResolver,参与Controller的激活进度,具体是在大局调用DependencyResolver的静态方法SetResolver方法。须要专注的是这里的 DependencyResolver类型(这里是体系,而别的地方论及的DependencyResolver都以组件的意趣)并未兑现 IDependencyResolver接口,作者感觉将它定名称叫DependencyResolverContainer会更确切一些。 IDepdencyResolver接口的概念如下:

  DependencyResolver是MVC中1个重中之重的零部件,从名字可以见见,它承受信赖对象的分析,能够说它是MVC框架之中选择的二个IOC容器。MVC内部诸多对象的创办都以透过它变成的,只怕大家平素从未有过一贯用到它,然则假若你在使用unity、autofac,只怕在看有的开源项目时,总会看出它的人影。接下来就让我们看一下那么些组件是如何职业的。

1
2
Ioc.RegisterType<IUserService, UserService>();
DependencyResolver.SetResolver(new IocDependencyResolver());
        private class DefaultDependencyResolver : IDependencyResolver        {            public object GetService(Type serviceType)            {                if (serviceType.IsInterface || serviceType.IsAbstract)                {                    return null;                }                try                {                    //如果Controller Type创建Controller实例对象                    return Activator.CreateInstance(serviceType);                }                catch                {                    return null;                }            }            public IEnumerable<object> GetServices(Type serviceType)            {                return Enumerable.Empty<object>();            }        }

  可以看来,它经过多个ControllerActivator来创制IController对象,暗中同意使用的是DefaultControllerActivator。与ControllerFactory类似,大家得以兑现IControllerActivator, 参与Controller的激活进程,具体是将ControllerActivator作为DefaultConrtollerFactory构造函数参 数,然后再在全局调用ControllerBuilder.Current.SetControllerFactory方法。能够观看MVC的 Controller激活进度是很灵活的,它提供多样方法让我们自定义激活进度。DefaultControllerActivator定义如下:

本文由68399皇家赌场发布于集成介绍,转载请注明出处:mvc控制器激活全分析

关键词: h5 组件 NET ASP mvc

上一篇:皇家娱乐登录绕过验证码,自动化测试

下一篇:没有了

最火资讯