在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. Linux默认权限的计算公式(个人理解性的笔记~)

    先记下Linux下的权限可以分为 常见的 r(Read,读取):对文件,读取文件内容的权限:目录来说,具有浏览目 录的权限.权限值=4 w(Write,写入):对文件而言,具有新增.修改文件内容的权限 ...

  2. NES模拟器开发-CPU笔记

    我的项目XNES已经开始动手编码了,目前的进度大概是cpu的模拟完成了大概10~20%左右.简单记录一下CPU模拟过程中遇到的问题和思考. 原理: cpu模拟实际就是模拟cpu处理opcode的过程, ...

  3. 【bzoj3211】花神游历各国

    Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 551 1 2 2 1 2 1 1 2 2 2 ...

  4. Ceph剖析:数据分布之CRUSH算法与一致性Hash

    作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...

  5. Docker-3:Data Volume

    Sometimes,  applications need to share access to data or persist data after a container is deleted. ...

  6. ie8 iframe去掉边框的属性

    <iframe src="" id="Iframe" height="200" frameborder="0" s ...

  7. C# System.Timers.Timer的一些小问题?

    比如设置间隔时间是 1000msSystem.Timers.Timer mytimer = new System.Timers.Timer(1000);问题若响应函数执行的时间超过了 1000 ms, ...

  8. hdoj 1002 A+B(2)

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  9. 1306. Sorting Algorithm 2016 12 30

    1306. Sorting Algorithm Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description One of the f ...

  10. ASP.NET页面之间传递值的几种方式

    目录 QueryString Session Cookie Application 一.QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中. ...