在ABP框架中提供了一套动态生成ApiController的机制(依然支持原生ApiController的使用方式),虽然说是动态生成ApiController但是实际上并没有真正在启动程序的时候生成任何ApiController类的子类,客户端所有对动态控制器的访问都集中到同一个泛型类DynamicApiController<T>上。真正用来区别不同服务的是其泛型T,这是一个继承自IApplicationService的接口,用户自定义的应用服务类继承T接口并实现其中的方法。系统在启动阶段会自动注册所有应用服务类。

  实际上动态控制器之所以能工作就是依赖IApplicationService在程序开始阶段已经被注册到容器中。ABP框架中存在一个拦截器AbpDynamicApiControllerInterceptor<T>,在DynamicApiController<T>控制器类型上添加接口代理(IApplicationService的子类)也就是说对该控制器类型的任何应用服务方法的访问都会被拦截,利用拦截器的构造函数public AbpDynamicApiControllerInterceptor(T proxiedObject),将应用服务的真实类型解析进去,然后通过反射执行应用服务中的方法。比较漂亮的一点就是自定义的AbpApiControllerActionSelector和DynamicHttpActionDescriptor类,在Selector的SelectAction方法中会新建一个DynamicHttpActionDescriptor实例,并将IApplicationService子接口的方法MethodInfo传递进去,这样就可以利用WebApi原生的参数绑定机制完成参数的获取了。

  在程序的开始阶段调用DynamicApiControllerBuilder的泛型方法ForAll<T>(Assembly assembly, string servicePrefix)找到assembly中所有T的自定义子接口,根据子接口及其中定义的方法包装成DynamicApiControllerInfo和DynamicApiMethodInfo存储到DynamicApiControllerManager静态类中字典字段中,以后需要获取任意一个控制器的信息也是通过该静态类根据Servic的名字来获得的。

  访问的话就没有多少好说的了,在DynamicApiControllerBuilder收集所有应用服务信息来生成DynamicApiControllerInfo的时候可以指定Prefix,以后所有希望调用IApplicationService的Request都需要有该前缀,至于服务的名称默认是IApplicationService的子接口名(像“ApplicationService”,”AppService“等等几个后缀还是需要去掉的,最前面“I”也是要删掉的),当然后可以定义一个委托Func<Type, string> _serviceNameSelector,来自定义服务名,再就是在服务名的后面添加方法名来唯一定位到应用服务的Action。别忘了定义Route,系统默认定义了一个services为前缀的动态控制器的RouteTemplate。

ABP框架详解(八)动态ApiController的生成和访问机制的更多相关文章

  1. ABP框架详解(五)Navigation

    ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...

  2. ABP框架详解(七)Caching

    在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...

  3. ABP框架详解(四)Feature

    ABP框架中存在一个Feature的特性,功能和设计思路非常类似于框架中的Authorization功能,都是来控制用户是否能够继续操作某项功能,不同点在于Authorization默认是应用在IAp ...

  4. ABP框架详解(三)Domain

    此处的Domain主要指Abp类库根目录下Domain文件夹.顾名思义该目录下是用来存放与领域实体,领域逻辑执行,存储,领域服务相关的内容. 1.Entities (1)为整个Abp框架后期开发的所有 ...

  5. ABP框架详解(二)AbpKernelModule

    AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitiali ...

  6. ABP框架详解(一)ABPBootstrapper

    在ABP框架的AbpBootstrapper主要用于框架的基本配置的注册和初始化,在Web应用启动阶段实例化一个AbpBootstrapper并调用Initialize方法初始化,该类主要包含两个公有 ...

  7. ABP框架详解(六)Aspects

    这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...

  8. Solon 框架详解(十一)- Solon Cloud 的配置说明

    Solon 详解系列文章: Solon 框架详解(一)- 快速入门 Solon 框架详解(二)- Solon的核心 Solon 框架详解(三)- Solon的web开发 Solon 框架详解(四)- ...

  9. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

随机推荐

  1. opencv单目摄像机标定(一)

    #include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...

  2. window.close(); 关闭浏览器窗口js代码的分析总结

    序号 关闭代码 需要确认 无任何作用 无需确认 测试 1 window.close() IE7 firefox,chrome,safari Opera Close 2 window.opener=nu ...

  3. Beta-1阶段成员贡献分(代组长更新)

    组名:天天向上 组长:王森 小组成员:张金生.张政.林莉.胡丽娜 小组贡献分如下:王森5.2   张金生5.1  张政 5.0   林莉 4.9 胡丽娜 4.8 成员得分如下: 成员 基础分 表现分 ...

  4. .net使用mvc模式开发web应用 模型与视图间的数据处理

    http://www.cnblogs.com/JeffreyZhao/archive/2009/02/27/mvc-use-strong-type-everywhere.html#3427764 本文 ...

  5. iava多线程详解(2)-成员变量与局部变量访问

    有两段代码 1.线程访问成员变量 public class FirstThreadTest { public static void main(String[] args) { FirstThread ...

  6. HTML5.dcloud.io-stream-app

    dcloud.io提出的Stream App 本文仅仅是关于dcloud.io提出的SteamApp初探,所有内容请参考其官网. 1. Application promotion by scaning ...

  7. 一次诡异的TOMCAT启动故障的解决

    该系统采用TOMCAT+SSH+Linux+Proxool连接池, 以前数据库是本地连接. 后换数据库远端连接,最近老是启动不了. 1.怀疑是proxool连接池没有自动断开后恢复.尝试解决,不是这个 ...

  8. Tier和RBD Cache的区别

    相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...

  9. spring mvc 工作流程

    Spring Web MVC 处理Http请求的大致过程:一旦Http请求到来,DispatcherSevlet将负责将请求分发.DispatcherServlet可以认为是Spring提供的前端控制 ...

  10. QQ邮箱发送邮件,出现mail from address must be same as authorization user错误

    之前做的一个系统,有个发送邮件的功能,一直能正常使用,今天同事说QQ邮箱发送不了. 立马着手调试,发现服务器一直出现“mail from address must be same as authori ...