我们想要这个服务暴露成一个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>

ABP 基于DDD的.NET开发框架 学习(六)创建新动态Api的更多相关文章

  1. ABP 基于DDD的.NET开发框架 学习(一)

    ABP总体介绍 ABP是ASP.NET Boilerplate Project,ASP.NET样板项目. ABP框架定位于快速开发 ABP是一个用于最快实践和流行开发现代Web应用程序的新起点,旨在成 ...

  2. ABP 基于DDD的.NET开发框架 学习(二)创建实体

    1.创建模型类打开.Core项目,新建新建一个项目文件夹(Demo);为了演示表关联及外键的使用,创建两个类:创建类ClothesCategoty.csusing Abp.Domain.Entitie ...

  3. ABP 基于DDD的.NET开发框架 学习(五)中使用DevExpress插件

    1.DevExpress安装 安装步骤1:开始安装 安装步骤2:选择需要安装的模块 安装步骤3:修改安装路径 安装步骤4:正在安装 安装步骤5:安装完成 2.Vs中设置 1)DevExtremeBun ...

  4. ABP 基于DDD的.NET开发框架 学习(四)时间控件采用datetimepicker注意事项

    $('#datetimepicker1').datetimepicker({ format: 'yyyy/mm/dd hh:ii:ss',//这是只能用小写的大写的与ABP中的字母识别起冲突 loca ...

  5. ABP 基于DDD的.NET开发框架 学习(三)创建模块:任务管理

    1.图标i获取:https://material.io/icons/查看2.js中创建如var _tenantService = abp.services.app.tenant;需清除页面的缓存,按c ...

  6. ABP 基于DDD的.NET开发框架 学习(七)继承不同的service直接调用api的区别

    1.IApplicationService->IBaseService->具体IXXXService 具体XXXService->BaseService,具体IXXXService ...

  7. 线上分享-- 基于DDD的.NET开发框架-ABP介绍

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

  8. 基于DDD的.NET开发框架 - ABP领域服务

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  9. 基于DDD的.NET开发框架 - ABP初探

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

随机推荐

  1. Pytest权威教程(官方教程翻译)

    Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...

  2. mysql 根据日期时间查询数据

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  3. Beta冲刺(1/5)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 初步任务分配 提交记录(全组共用) 接下来的计划 完善接口文档 还剩下哪些任务 学习软工的理论课 学习代码评估.测试 燃尽 ...

  4. Tkinter 之文件管理器

    一.效果图 二.功能描述 1.打开文件菜单中的打开按钮,可以选择目录. 2.可以查看各种类型的图片. 3.可以编辑文本. 4.显示行号功能,可改变目录显示的宽度. 三.使用的标签 1.Menu 2.F ...

  5. mysql 存储过程 REPEAT ... UNTIL ... END REPEAT

    begin   declare  b int;   declare  use_no    varchar(10);   declare  use_name  varchar(400);   decla ...

  6. Cannot read property '_withTask' of undefined

    前言 Cannot read property '_withTask' of undefined 突然一下子,就报这个错了,刚刚还好好呢 Bug分析 1.是在template中调用了某个方法,但是你没 ...

  7. 一、JavaScript基础

    一.区分大小写 ECMAScript中的一切(变量.函数名和操作符)都区分大小写,(js用于行为交互.数据交互.逻辑交互) 二.标识符 指变量.函数.属性的名字,或者函数的参数 命名规则:1.第一个字 ...

  8. Mac使用秘钥登录Linux服务器

    简介 在 Mac 上配置 SSH 密钥登录远程的 Linux 相关配置 1.创建本地的 SSH 密钥 本地 生成秘钥对 ssh-keygen -t rsa -C 'youxiang@aliyun.co ...

  9. Protobuf多协议

    上一篇只有Person的message,如果多了一个message,如Dog,这样就会有问题. 解决方法: 定义多协议 一.定义proto文件 syntax = "proto2"; ...

  10. vue---数据列表循环

    使用vue进行数据循环是非常常见的操作,下面是用利用forEach和map来进行数据循环: 最常见的 forEach 循环: tbody.forEach((item,key) => { .... ...