建立动态Web API 控制器

ASP.NET Boilerplate 能够自动为您的应用层产生Web API层。比如说我们有如下的一个应用服务:

 public interface ITaskAppService : IApplicationService
{
GetTasksOutput GetTasks(GetTasksInput input);
void UpdateTask(UpdateTaskInput input);
void CreateTask(CreateTaskInput input);
}

我们想要这个服务暴露成一个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方法中排除,比如你可以向下面这样定义:

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

ForAll 方法

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

 DynamicApiControllerBuilder
.ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SimpleTaskSystemApplicationModule)), "tasksystem")
.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方法:

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

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

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

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

AJAX参数

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

 abp.services.tasksystem.task.createTask({
assignedPersonId: ,
description: 'a new task description...'
},{ // 覆盖jQuery的ajax参数
async: false,
timeout:
}).done(function () {
abp.notify.success('successfully created a task!');
});

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

单独服务脚本

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

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

Angular 支持

ASP.NET Boilerplate 能够将动态API控制器暴露成AngularJs服务。如下面的例子:

 (function() {
angular.module('app').controller('TaskListController', [
'$scope', 'abp.services.tasksystem.task',
function($scope, taskService) {
var vm = this;
vm.tasks = [];
taskService.getTasks({
state: 0
}).success(function(data) {
vm.tasks = data.tasks;
});
}
]);
})();

我们能够用名称(带命名空间)注入一个服务。然后我们能够像调用普通Javascript方法一样调用它的方法。需要注意,由于这像是在Angular的$http服务中,所以我们注册了一个success处理程序(代替done)。 ASP.NET Boilerplate 使用了AngularJs的 $http 服务。如果你想要传递$http配置,你可以把一个配置对象作为服务方法的最后一个参数传递。

为了能够使用自动产生的服务,你需要在页面中包含必须的脚本:

 <script src="~/Abp/Framework/scripts/libs/angularjs/abp.ng.js"></script>
<script src="~/api/AbpServiceProxies/GetAll?type=angular"></script>

Durandal 支持

ASP.NET Boilerplate支持在Durandal 应用程序中注入服务代理。看一个视图模型的例子:

 define(['service!tasksystem/task'],
function (taskService) {
//taskService 可以在这儿使用
});

ASP.NET Boilerplate 通过配置 Durandal (实际上是Require.js ) 来解析“service!”前缀,并且注入适当的Javascript 服务代理。

本文翻译自ASP.NET Boilerplate官网,原文地址:  http://www.aspnetboilerplate.com/Pages/Documents/Dynamic-Web-API

DDD开发框架ABP之动态Web API层的更多相关文章

  1. ABP框架 - 动态Web Api层

    文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...

  2. 动态Web API层

    返回总目录 本篇目录 构建动态Web API控制器 ForAll 方法 重写ForAll 方法 Http动词 动态Javascript代理 Ajax参数 单一服务脚本 Angular支持 Durand ...

  3. [ABP框架]动态web Api的拦截用法。

    先进行配置 首先这种需求,一般发生在APP端,我们给APP,不会给所有项目系统的接口给他们用.我们系统有200个接口,但是APP的需求只会用20个.那么这个需求也就应运而生了. 以上为API文件夹中为 ...

  4. ABP官方文档翻译 5.2 动态We API层

    动态Web APID层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteS ...

  5. DDD开发框架ABP之本地化/多语言支持

    本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...

  6. ABP文档 - Web Api 控制器

    文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web. ...

  7. 【asp.net core】实现动态 Web API

    序言: 远程工作已经一个月了,最近也算是比较闲,每天早上起床打个卡,快速弄完当天要做的工作之后就快乐摸鱼去了.之前在用 ABP 框架(旧版)的时候就觉得应用服务层写起来真的爽,为什么实现了个 IApp ...

  8. DDD开发框架ABP之本地化资源的数据库存储扩展

    在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认 ...

  9. DDD开发框架ABP之导航菜单

    每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户.本文主要说明菜单的创建 ...

随机推荐

  1. 64位Win7添加32位XP的共享打印机

    windows无法连接到打印机 错误提示0x00000214 win7 64位系统,连接32位xp上的共享打印机,提示“操作失败,错误为 0x00000214”. 使用以下方法连接就没问题了: 开始— ...

  2. 如何用注解简化SSH框架

    一.简化代码第一步,删除映射文件,给实体类加上注解 @Entity //声明当前类为hibernate映射到数据库中的实体类 @Table(name="news") //声明tab ...

  3. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  4. 【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx

    有好几种情况,我先说我的这个情况 1.word设置不当导致 看图: 然后就能打开了~ 2.word格式问题,比如原来是doc,被人手动改成docx~~~ 解决方法:改回来 3.word版本不兼容,比如 ...

  5. easyui中方向键、tab键、回车键

    1.html中 function changeTab(event, i) { var keyCode = event.keyCode; var inputs = jQuery("#table ...

  6. ASP.NET MVC之分部视图和ChildAction(三)

    前言 上节我们已经非常清晰并且明确的讲了@Html.ActionLink的作用,这一节我们开始讲讲分部视图以及孩子Action. 话题 在C#中我们知道继承的目的是为了代码的复用,在Web应用程序同样 ...

  7. angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”

    曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...

  8. webapp应用---cordova.js 3.7.0插件安装总结

    今天是2014年的最后一天,年终总结什么的就不写了.记录一下今天的工作内容.如果不知道phoneGap,那么就不需要往下看了,phoneGap现在已经叫cordova了,叫什么不重要,重要的是它对we ...

  9. GROUP BY的扩展

    GROUP BY的扩展主要包括ROLLUP,CUBE,GROUPING SETS三种形式. ROLLUP rollup相对于简单的分组合计增加了小计和合计,解释起来会比较抽象,下面我们来看看具体事例. ...

  10. 初识MongoDB

    1. 初识 接触MongoDB,是由于最近在工作中用到了MongoDB做数据存储.之前也听说过这个NoSQL数据库,但是一直没有尝试去使用它做开发.这次趁着这个机会,想好好学习下这个NoSQL数据库. ...