在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. Symmetric Difference

    function sym(args) { //return args; var arr = []; for(var i = 0; i < arguments.length; i++){ arr. ...

  2. Hibernate 注解的用法以及说明

    1.类级别注解 @Entity     映射实体类 @Table    映射数句库表  @Entity(name="tableName") - 必须,注解将一个类声明为一个实体be ...

  3. 我 && symfony3 (路由)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Helvetica Neue"; color: #323333 } p. ...

  4. [工具.tfs]可视化的TFS命令工具——Team Foundation Sidekicks

    工具介绍:http://www.attrice.info/cm/tfs/index.htm Team Foundation Sidekicks is a suite of tools for Micr ...

  5. git资料图

  6. Merge Intervals 运行比较快

    class Solution { public: static bool cmp(Interval &a,Interval &b) { return a.start<b.star ...

  7. final、finally、finalize的区别

    看C#知识点的时候发现的问题 1.final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为f ...

  8. C++实现简单的单链表

    下面实现的是一个简单的单链表 功能不多,学习使用 #pragma once #include <iostream> using namespace std; class ListEx { ...

  9. RSpec shared examples with template methods

    It’s pretty common to have multiple tests that are nearly the same. In one app, we support bidding o ...

  10. virtualbox下面安装ubuntu后外网如何远程ssh访问

    这两天在折腾virtualbox安装linux的事情,想多弄几个节点,装hadoop, 环境如下 两台thinkpad, 一台正常上班用的,win7 一台装的ubuntu kylin 16.04, 上 ...