ABP(現代ASP.NET樣板開發框架)系列之20、ABP展示層——動態生成WebApi

點這裏進入ABP系列文章總目錄javascript

 

ABP(現代ASP.NET樣板開發框架)系列之20、ABP展示層——動態生成WebApihtml

 

ABP是「ASP.NET Boilerplate Project (ASP.NET樣板項目)」的簡稱。java

ABP的官方網站http://www.aspnetboilerplate.comgit

ABP在Github上的開源項目https://github.com/aspnetboilerplateangularjs

 


 

創建動態WebApi控制器

Abp框架可以經過應用層自動生成web api:github

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

Abp框架經過一行關鍵代碼的配置就能夠自動、動態的爲應用層創建一個web api 控制器:web

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

這樣就OK了!建好的webapi控制器(/api/services/tasksystem/task)全部的方法都可以在客戶端調用。webapi控制器一般是在模塊初始化的時候完成配置。 ITaskAppService是應用層服務(application service)接口,咱們經過封裝讓接口實現一個api控制器。ITaskAppService不只限於在應用層服務使用,這僅僅是咱們習慣和推薦的使用方法。 tasksystem/task是api 控制器的命名空間。通常來講,應當最少定義一層的命名空間,如:公司名稱/應用程序/命名空間/命名空間1/服務名稱。 ‘api/services/’是全部動態web api的前綴。因此api控制器的地址通常是這樣滴:‘/api/services/tasksystem/task’,GetTasks 方法的地址通常是這樣滴: ‘/api/services/tasksystem/task/getTasks’。由於在傳統的js中都是使用駝峯式命名方法,這裏也不同。 你也能夠刪除一個api方法,以下:ajax

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

ForAll方法 在程序的應用服務層創建多個api控制器可能讓人以爲比較枯燥,DynamicApiControllerBuilper提供了創建全部應用層服務的方法,以下所示:api

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

ForAll方法是一個泛型接口,第一個參數是從給定接口中派生的集合,最後一個參數則是services命名空間的前綴。ForAll集合有ITaskAppService和 IpersonAppService接口。根據如上配置,服務層的路由是這樣的:'/api/services/tasksystem/task'和'/api/services/tasksystem/person'。架構

服務命名約定:服務名+AppService(在本例中是person+AppService) 的後綴會自動刪除,生成的webapi控制器名爲「person」。同時,服務名稱將採用峯駝命名法。若是你不喜歡這種約定,你也能夠經過「WithServiceName」方法來自定義名稱。若是你不想建立全部的應用服務層,可使用where來過濾部分服務。

使用動態JavaScript代理

你能夠經過ajax來動態建立web api控制器。Abp框架對經過動態js代理創建web api 控制器作了些簡化,你能夠經過js來動態調用web api控制器

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

js代理是動態建立的,頁面中須要添加引用:

    <script src="/api/abp.ServiceProxies/GetAll" type="text/javascript"></script>

服務方法(service methods)返回約定(可參見JQ的Deferred),服務方法使用Abp框架.ajax代替,能夠處理、顯示錯誤。

Ajax參數

自定義ajax代理方法的參數:

    Abp.services.tasksystem.task.createTask({
        assignedPersonId: 3,
        description: 'a new task description...'
    },{ //override jQuery's ajax parameters
        async: false,
        timeout: 30000
    }).done(function () {
        Abp.notify.success('successfully created a task!');
    });

全部的jq.ajax參數都是有效的。

單一服務腳本

'/api/abpServiceProxies/GetAll'將在一個文件中生成全部的代理,經過 '/api/abpServiceProxies/Get?name=serviceName' 你也能夠生成單一服務代理,在頁面中添加:

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

Augular框架支持

Abp框架可以公開動態的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;
                });
            }
        ]);
    })();

咱們能夠將名稱注入服務,而後調用此服務,跟調用通常的js函數同樣。注意:咱們成功註冊處理程序後,他就像一個augular的$http服務。ABP框架使用angular框架的$http服務,若是你想經過$http來配置,你能夠設置一個配置對象做爲服務方法的一個參數。

要使用自動生成的服務,須要添加:

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

 

Durandal支持

ABP框架能夠注入服務到Durandal框架,以下:

    define(['service!tasksystem/task'],
    function (taskService) {
        //taskService can be used here
    });

ABP框架配置Durandal(其實是Require.js)來解析服務代理並注入合適的js到服務代理。

 


 

但願更多國內的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目能夠發展得更好。

歡迎加QQ羣:

ABP架構設計交流羣:134710707 ABP架構設計交流羣      ABP架構設計交流2羣: 579765441ABP架構設計交流羣2

 

點這裏進入ABP系列文章總目錄

相關文章
相關標籤/搜索