建立动态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. ThreaLocal内存泄露的问题

    在最近一个项目中,在项目发布之后,发现系统中有内存泄漏问题.表象是堆内存随着系统的运行时间缓慢增长,一直没有办法通过gc来回收,最终于导致堆内存耗尽,内存溢出.开始是怀疑ThreadLocal的问题, ...

  2. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  3. 【PRINCE2是什么】PRINCE2认证之七大原则

    经过前几讲中关于PRINCE2六大要素,四大步骤及整体思维架构的学习,相信各位看官已经对于PRINCE2有了大概的了解,那我们今天的学习内容会正式进入到七大原则内容的分享. 我们先来回顾一下,PRIN ...

  4. Intellij IDEA 13.1.3 创建Java Web项目

    作者QQ:1095737364 1.  Intellij 编辑工具,找到File-->New Project 2.   打开后点击java-->选中WebApplication 和Java ...

  5. PHP运行及语句及逻辑

    php开发网页需要存放在wamp根目录下的www文件夹中才可运行成功.同时wamp要处于运行状态.  无站点情况下打开方式:  网址栏中输入:localhost/文件名称 代码规范: 用 <?p ...

  6. Sql Server系列:嵌套查询

    嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...

  7. Entity Framework Code First执行SQL语句、视图及存储过程

    1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...

  8. Python标准模块--collections

    1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选择: namedtuple,可以创建包含名称的tuple ...

  9. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

  10. Windows Server 2012 为什么没有“磁盘清理”选项了?

    用习惯了客户端版的Windows,对于磁盘清理想必大家都不会陌生,他具有安全.快捷.准确.集中化的删除系统中的临时文件.管理系统还原卷影副本.添加删除程序的快捷入口等便捷功能,而在Server版的Wi ...