• DDD开发框架ABP之动态Web API层


    建立动态Web API 控制器

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

    1 public interface ITaskAppService : IApplicationService
    2 {
    3     GetTasksOutput GetTasks(GetTasksInput input);
    4     void UpdateTask(UpdateTaskInput input);
    5     void CreateTask(CreateTaskInput input);
    6 }

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

    Angular 支持

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

     1 (function() {
     2     angular.module('app').controller('TaskListController', [
     3         '$scope', 'abp.services.tasksystem.task',
     4         function($scope, taskService) {
     5            var vm = this;
     6            vm.tasks = [];
     7            taskService.getTasks({
     8            state: 0
     9        }).success(function(data) {
    10        vm.tasks = data.tasks;
    11      });
    12     }
    13    ]);
    14 })();

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

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

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

    Durandal 支持

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

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

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

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

  • 相关阅读:
    layer 弹出在 iframe内部弹出不居中是原因
    关于 DropDownList 循环绑定中遇到的问题
    C# Oracle insert 过程中出现中文乱码问题
    使用C#实现sql server 2005 和Oracle 数据同步
    C# mysql 数据库操作模板
    spring jar 包详解、依赖说明
    在js中使用jstl标签给js变量赋值
    maven3 在创建web项目时:Dynamic Web Module 3.0 requires Java 1.6 or newer 错误
    hadoop start-all.sh 启动出错java.lang.ClassNotFoundException: start-all.sh
    jquery easyui datagrid 排序
  • 原文地址:https://www.cnblogs.com/defzhu/p/4836470.html
Copyright © 2020-2023  润新知