我们想要这个服务暴露成一个Web API控制器,以方便客户端调用。ASP.NET Boilerplate能够自动且动态地为这个应用服务创建Web API 控制器,只需要一行配置代码即可完成。

DynamicApiControllerBuilder.For<ITaskAppService>("tasksystem/task").Build();

这几乎是全部代码!一个API控制器被创建,其地址是“/api/services/tasksystem/task”,同时所有的方法在客户端都是可用的。这个配置通常是在模型初始化的时候执行。

ITaskAppService 是我们想要包装成API控制器的应用服务,这是没有严格限制的,但是一种通用且推荐的做法。“tasksystem/task”是API控制器的命名空间的名称,名称可以是任意的。你可以定义至少一个层级的命名空间,也可以定义更多层级的命名空间,比如: “myCompany/myApplication/myNamespace1/myNamespace2/myServiceName”。“/api/services/”是所有动态Web API控制器的前缀。因此,API控制器的地址就会是: “/api/services/tasksystem/task”,同时 GetTasks方法的地址就是“/api/services/tasksystem/task/getTasks”。其中方法名称会被自动转换成camel规则(首字母小写),这是Javascript代码的传统惯例。
    你也可以将应用服务的某些方法从API方法中排除,比如你可以向下面这样定义:

1 DynamicApiControllerBuilder
2 .For<ITaskAppService>("tasksystem/taskService")
3 .ForMethod("CreateTask").DontCreateAction()
4 .Build();

ForAll 方法

在一个应用系统中,我们可能有很多个应用服务,那么一个接一个地建立API将是一件冗长无聊且容易遗忘的工作。
    DynamicApiControllerBuilder提供了一个方法只要一次调用就能为所有应用服务建立Web API控制器:

1 DynamicApiControllerBuilder
2 .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SimpleTaskSystemApplicationModule)), "tasksystem")
3 .Build();

ForAll 是个泛型方法,泛型类型是一个接口. 第一个参数是程序集,里面有一些实现了给定接口的类。最后一个接口是服务的命名空间前缀。比如说,在程序集里我们有ITaskAppService 和IPersonAppService 两个接口。根据配置,服务将会是“/api/services/tasksystem/task” 和“/api/services/tasksystem/person”。为了产生服务名称,框架会将接口名称中的Service 和AppService 后缀以及I前缀自动去除。同时服务名称也会自动被转换成符合camel大小写规则。如果你不喜欢这样的转换,可以使用“WithServiceName”方法,这样你可以自行决定名称。 这对于为绝大部分应用服务建立API控制器是非常有帮助的。

使用动态Javascript代理

你可以在Javascript的 Ajax方法中使用这些动态创建的Web API。ASP.NET Boilerplate也提供的更简单的方式:为动态Web API控制器创建了动态的Javascript代理。因此,你能够在Javascript中像调用函数一样调用一个动态Web API方法:

1 abp.services.tasksystem.task.getTasks({
2 state: 1
3 }).done(function (data) {
4 //use data.tasks here...
5 });

Javascript代理都是动态创建,使用前你需要在页面中包含动态脚本:

<script src="/api/AbpServiceProxies/GetAll" type="text/javascript"></script>

服务方法返回承诺(查看 jQuery.Deferred)。你能够通过注册实现“完成”,“失败”以及“回调”等等。服务方法里面包含了abp.ajax,它们处理错误并在需要时显示错误信息。

AJAX参数

你可能想要传输自定义的ajax参数到代理方法中。你能够传输第二参数来实现如下:

1 abp.services.tasksystem.task.createTask({
2 assignedPersonId: 3,
3 description: 'a new task description...'
4 },{ // 覆盖jQuery的ajax参数
5 async: false,
6 timeout: 30000
7 }).done(function () {
8 abp.notify.success('successfully created a task!');
9 });

所有 jQuery.ajax 参数在这里都是有效的。

单独服务脚本

“/api/AbpServiceProxies/GetAll”在一个文件中生成所有的服务代理。你也可以使用“/api/AbpServiceProxies/Get?name=serviceName”来生成单独的服务代理,只需要在页面中包含下面的脚本代码:

<script src="/api/AbpServiceProxies/Get?name=tasksystem/task" type="text/javascript"></script>

最新文章

  1. 如何面试前端工程师:GitHub 很重要
  2. iOS Swift-元组tuples(The Swift Programming Language)
  3. gulp-nodemon 和 gulp-livereload 配置
  4. HTTP 304
  5. phoenix与spark整合
  6. linux下查看系统进程占用的句柄数
  7. 如果是除去末尾特定字符或字符串:TrimEnd方法性能优于Remove方法
  8. [CODEVS1037]取数游戏
  9. win10系统安装 VS 2015 安装包下载
  10. nyoj 592 spiral grid(广搜)
  11. margin问题
  12. Ehcache 的简单实用 及配置
  13. 各种输出速度比较(小白应该来看看,dalao绕道)
  14. [Kafka] |FAIL|rdkafka#producer-1 : Receive failed: Disconnected
  15. 三层结构、MVC的简介
  16. 【转】一次SpringMVC+ Mybatis 配置多数据源经历
  17. 如何给Windows Server 2012 R2 添加“磁盘清理”选项
  18. STL_iterator返回值
  19. Navicat使用教程:获取MySQL中的高级行数(第2部分)
  20. linux每天一小步---find命令详解

热门文章

  1. 关于集成通用mapper的Mybatis代码生成器产生的model类注解
  2. mysql sqrt() 函数
  3. CF1220题解
  4. webpack系列之安装(Mac OS)
  5. sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
  6. iostat参数说明
  7. python中video system not initialized怎么解决
  8. iostat vmstat
  9. Python - Django - form 组件校验功能
  10. 浏览器中开发人员工具快速找到dom元素绑定那些JS事件