当前位置: 首页 > news >正文

绍兴网站seo专门做淘宝代运营的网站

绍兴网站seo,专门做淘宝代运营的网站,高校网站建设工作总结,使用apmserv本地搭建多个网站动态WebAPI应该算是ABP中最Magic的功能之一了吧。开发人员无须定义继承自ApiController的类#xff0c;只须重用Application Service中的类就可以对外提供WebAPI的功能#xff0c;这应该算是对DRY的最佳诠释了. 如下图所示#xff0c;一行代码就为所有实现了IApplicationSer…动态WebAPI应该算是ABP中最Magic的功能之一了吧。开发人员无须定义继承自ApiController的类只须重用Application Service中的类就可以对外提供WebAPI的功能这应该算是对DRY的最佳诠释了. 如下图所示一行代码就为所有实现了IApplicationService的类型自动创建对应的动态WebAPI. 这么Magic的功能是如何实现的呢 本文为你揭开其Magic的外表。你会发现实现如此Magic的功能最关键的代码只有四行。 先思考一个问题如果不从ASP.NET WebApi 的ApiController继承我们能实现ASP.NET WebAPi吗 答案不可以. 从APIController继承来实现我们自己的HttpController是实现ASP.NET WebApi的前提。 那么问题又来了。我们在使用ABP框架的时候没有创建任何从APIController继承的类。那么从APIController继承的类在哪里?和ApplicationService中的类又有怎样的关系 先给出答案ABP框架自动给ApplicationService中的类创建了“HttpController”他们从APIController继承。 基于上面的分析要实现WebApi有三个问题需要解决如何定义HttpController路由的规则如何设置如何激活和调用HttpController中的Action接下来逐一解答。 如何定义HttpController ABP中ApplicationService并不是从APIController继承或实现IHttpController接口。为解决HttpController类型缺失的问题ABP首先为所有的ApplicationService动态的创建一个DynamicApiControllerT 这个类继承自AbpApiController其中T是接口继承自IApplicationService。 但是DynamicApiControllerT 是一个空的类其没有任何Action. 这样的HttpController类显然无用的。那么如何给这些动态生成的DynamicApiControllerT对象根据TApplicationService接口中对应的方法添加相对应的Action 看似复杂的问题ABP以一种巧妙的办法解决了关键就在AbpWebApiModule中的4行代码下面59-62行。这里简单解释一下ABP的做法 1. 通过Castle创建DynamicApiControllerT的代理类 2. 为代理类动态添加ApplicationService接口这里就是指T也就是让代理类实现了接口T这样通过代理类就可以访问接口T中定义的方法 3. 同时为代理类添加拦截器。 这样当ABP通过Castle获取DynamicApiControllerT实例的时候其实得到的是DynamicApiControllerT的代理类关键。 通过DynamicApiControllerT的代理类调用ApplicationService的接口中的定义的方法的时候必须通过反射的方式调用因为接口T中的方法对DynamicApiControllerT实例是不可见的。但实际上是可见的因为你得到的是从T接口继承的DynamicApiControllerT的代理类实例而不是DynamicApiControllerT实例本身。会被拦截器拦截。而拦截器则调用真正的ApplicationService对象来执行方法这里也很关键因为代理类中只要方法的声明没有实现。所以这里需要拦截器将其方法调用拦截并路由到真正的ApplicationService对象上。对这四行代码不理解的话可先阅读下文http://www.cnblogs.com/1zhk/p/5399548.html 。 举个例子 假设有一个ApplicationService的接口是IFooAppication. 第59行DynamicApiControllerIFooAppication被register到Castle容器中。 第60行为DynamicApiControllerIFooAppication创建proxy代理并为该代理添加接口IFooAppication。 第61行为proxy代理添加拦截器AbpDynamicApiControllerInterceptorIFooAppication 路由的规则如何设置 通过AbpWebApiModule的InitializeRoutes方法硬编码在Abp.Web.Api的代码中。很明显这里路由使用了*通配符也就是所有api/services/XXXX的请求都是有效的都会进入WebApi的消息管道。 如何根据routedata激活和调用具体生成的DynamicApiControllerT对象? ABP通过AbpWebApiModule的InitializeAspNetServices方法使用自定义的对象替换了默认的IhttpControllerSelector对象IHttpActionSelector对象IHttpControllerActivatore对象。如果了解ASP.Net WebApi底层工作原理的开发人员一定对这三个接口应该很熟悉。如果不了解的同学要先做做功课才能明白后文的内容。 至此大概解释了ABP的动态WebApi的工作原理。 以下是对与动态WebAPI相关的接口和对象逐一分析。这些接口和类都围绕着两个中心目标为动态Controller创建可供ASP.NET WebApi使用的描述器和选择器DescriptorSelector以及构建和保存动态Controller的类型信息。 首先看看ApiController和Configuration AbpApiController继承了MVC的ApiControllerABP 中的WebApi Controller直接或间接的都从AbpApiController继承。第二张图显示了AbpApiController引用了哪些ABP核心类库中的功能模块的对象。 IDynamicApiController空接口用于标识其实现是一个动态生成的ApiController。 DynamicApiControllerT用作所有动态生成的ApiController的基类。 IAbpWebApiModuleConfiguration/AbpWebApiModuleConfiguration : 封装了HttpConfiguration属性初始化为GlobalConfiguration.Configuration对象。 因为ASP.NET Web API在Web Host下通过ASP.Net的静态类型GlobalConfiguration的Configuration属性获取到的用于配置请求处理管道的HttpConfiguration对象。ABP的动态WebApi本质上仍是ASP.NET Web API所以这样配置HttpConfiguration是必然的。 与Controller激活和调用相关的接口和类主要有下面这些。其实都是继承自ASP.NET WebAPi中默认的使用的对象并重载了一些方法以支持动态APiController的发现激活和调用。 DynamicHttpControllerDescriptor : 继承自asp.net Webapi系统的HttpControllerDescriptor,与ASP.NET WebAPI 中默认的HttpControllerDescriptor相比其多了一个IFilter[]数组。这样做的原因很简单因为ABP中的ApiController是动态生成的是没有标注Filter特性的。所以ABP通过下面这种方式给动态ApiController加上Filter。 DynamicHttpActionDescriptor : 继承自asp.net Webapi系统的ReflectedHttpActionDescriptor,与ASP.NET WebAPI 中默认的HttpActionDescriptor相比其多了一个IFilter[]数组。这样做的原因和上面一致 AbpHttpControllerSelector : 继承自asp.net Webapi系统的DefaultHttpControllerSelector。通过重写SelectController来返回HttpControllerDescriptor 这是ABP能动态创建APIController的关键。ASP.Net  WebAPI 中的IHttpControllerSelector对象负责根据HttpRouteData返回HttpControllerDescriptor。HttpControllerDescriptor中封装了controller的类型等信息。这里ABP通过继承DefaultHttpControllerSelector并重写SelectController方法来根据HttpRouteData中的数据创建HttpControllerDescriptor对象并返回 AbpApiControllerActivator实现了IHttpControllerActivator接口根据controllerType生成具体的controller. 由于ABP系统使用了Castle框架来管理对象。所以有必要实现自己的IHttpControllerActivator以替换ASP.Net系统默认的实现。 AbpApiControllerActionSelector : 继承自ASP.Net WebAPI 的 ApiControllerActionSelector。 通过重写SelectAction来返回HttpActionDescriptor的派生类DynamicHttpActionDescriptor的实例 这是ABP能执行动态创建的APIController的Action方法的关键。AbpApiControllerActionSelector 通过调用DynamicApiServiceNameHelper的静态方法传入routedata中的serviceNameWithAction获取action的那么 DynamicApiServiceNameHelper静态类提供四个静态方法。两个方法用于校验servicename是否合规还有两个方法用于servicename中获取service和action的name。 AbpDynamicApiControllerInterceptorT  实现了Castle的IInterceptor。作为动态生成的DynamicApiControllerT的拦截器它拦截所有对action的调用然后通过反射调用底层真实的IApplicationService对象的方法。 在传统的asp.net webapi应用中系统会根据路由信息通过反射到程序集中去匹配对应的controller的类型信息。而在ABP中controller的类型信息是初始化的时候直接添加到一个Dictionary集合中的。本文第一幅图中的代码干的就是这件事。完成这个功能模块所涉及的接口和类主要有以下这些。 上图代码中所示构建DynamicHttpControllerDescriptor 的数据来源于一个DynamicApiControllerInfo对象。那么DynamicApiControllerInfo对象又是在什么时候怎么构建的呢下图是ABP关于构建applicationService的DynamicApiControllerInfo对象所涉及的类型和接口。 DynamicApiControllerInfoABP用于封装ApiController的信息,下图显示了其所有的属性。其中最关键的属性就是ApiControllerType.其实就是一个DynamicApiControllerT类型其中的T就是具体的ApplicationService接口的类型。 DynamicApiActionInfo用于封装动态生成的ApiController的Action的信息actionNameFilters, methondinfo和httpVerb。DynamicApiControllerInfo封装了一个DynamicApiActionInfo的字典对象用以表示这个Controller可支持的Action列表。 DynamicApiControllerManager提供了一个Dictionary容器管理所有的DynamicApiControllerInfo对象。共有三个方法Register方法用于将DynamicApiControllerInfo添加到Dictionary容器中另外两个方法用于返回DynamicApiControllerInfo。 DynamicApiControllerBuilder提供两个方法一个ForT方法通过ApiControllerBuilder为某一个application service类创建DynamicApiControllerInfo。另一个ForAllT方法通过BatchApiControllerBuilder为某一类application service类这一类application service会有个共同的接口创建DynamicApiControllerInfo。 IApiControllerBuilderT/ApiControllerBuilderT其内部封装了一个字典对象IDictionarystring, ApiControllerActionBuilderT用于存放T的每个方法对应的ApiControllerActionBuilder对象。最后通过调用Build()方法生成完整的DynamicApiControllerInfo对象。这里注意观察IApiControllerBuilder的代码他是支持链式编程的可以通过WithFilters的方法给这个Application Service的API controller添加filter IBatchApiControllerBuilderT/BatchApiControllerBuilderT : 为assembly中符合命名规范的接口批量生成DynamicApiControllerInfo。其最后仍然是通过ApiControllerBuilder逐个为各个application service接口创建DynamicApiControllerInfo. 如下图ApiControllerBuilder在构建DynamicApiControllerInfo过程中需要调用ApiControllerActionBuilder对象去构建该DynamicApiControllerInfo所包含的DynamicApiActionInfo DynamicApiControllerActionHelper静态类用于获取一个type的所有方法property除外,object的原生方法除外ApplicationService除外的列表。 DynamicApiVerbHelper根据方法名按照约定返回httpVerb。 IApiControllerActionBuilder/ApiControllerActionBuilder:用于构建DynamicApiActionInfo对象的生成器。这里有一个注意点如上图如果action的methodName是以get开头的默认ABP会标注其httpVerb为Get 但是有一个例外如果方法的参数不为primitive 类型和不可为空类型时ABP会标注其httpVerb为Post。 AbiApiExplorer继承自ApiExplorer类实现了IApiExplorer接口。其ApiDescriptions属性既包括你自己编写的webApi 39-44行又包括ABP动态生成的WebApi47 -。 ABP通过遍历DynamicApiControllerManager中的DynamicControllerInfo然后在遍历DynamicControllerInfo的DynamicApiActionInfo为他们逐个构建ApiDescription实例。 返回ABP源码分析系列文章目录
http://www.pierceye.com/news/474586/

相关文章:

  • 个人网站 域名选择在线画图网页版
  • 外贸网站建设双语网站建设广州景点
  • 深圳宝安p2p网站系统的建设手机网站开发+手机模拟器
  • 合肥营销网站建设设计网站关键词做标签
  • 网站建设与管理实训心得怎么写wordpress图片太大
  • 用个人免费空间快速建立个人网站后方平台网络营销案例2022
  • 网站搭建h5是什么做图软件ps下载网站有哪些内容
  • 企业网站推广技巧和方法免费个人简历模板官网
  • wordpress 全站备份网站建设的实验心得体会
  • 给网站开发APP网站可信度必须做吗
  • 用地方名字做网站做网站那种语言好
  • 天河网站(建设信科网络)濮阳市城乡一体化示范区主任
  • 扬州网站建设link5深圳建外贸网站
  • 网站开发用什么编程淘宝网站开发方式
  • 网站ui设计包括哪些原则网站flash代码
  • 北京建设执业注册中心网站北京中兴时代网站建设
  • 深圳建站公司设计肥城网站建设推广
  • 对网站建设服务公司的看法wordpress主题自定义打不开
  • 宁夏电力建设工程公司门户网站万能编程软件
  • 网站上常用字体企业服务中心官网
  • 大作设计网站域名访问升级紧急中拿笔记好
  • 银川做网站的有哪些建筑工程网上报建网站诚信手册
  • 本地做网站绑定域名ic商城网站建设南大
  • react 网站开发seo软件资源
  • 中国最大免费wap网站怎样才能建设只是于自己的网站
  • 装修网站平台排行榜wordpress做视频网站吗
  • flash网站建设价格播放器网站怎么做
  • 微网站 源码 免费文本编辑器 网站
  • 电商网站通用左侧弹出导航有南昌网站优化公司
  • 沈阳三好街做网站公司个人网页设计风格分析