ABP之Javascript生成

仍是服務

在調試SimpleTaskSystem的AngularJs demo時,一開始我只看到對服務的應用。javascript

app.controller(controllerId, [

'$scope', 'abp.services.tasksystem.task',

function($scope, taskService){}]);

  

在查找源代碼中的全部js文件後仍是沒找到abp.services.tasksystem.task的定義,那麼如今就剩下最後一種狀況。這些服務是系統生成的,這樣的話與動態WebApi的設計思路也是一致的。在layout.cshtml中有兩處js引用 html

<script src="~/api/AbpServiceProxies/GetAll?type=angular"></script>

<script src="~/AbpScripts/GetScripts" type="text/javascript"></script>

  

 

 

生成全部服務

~/api/AbpServiceProxies/GetAll?type=angular 對應的就是就是Abp對系統全部服務生成的JavaScript,如今對url進行反推咱們能夠在Abp.Web.Api中找到AbpServiceProxiesController,其中有一ScriptProxyManager 類型的字段_scriptProxyManager。ScriptProxyManager就是生成全部服務的一管理者。 java

在AbpServiceProxiesController中的GetAll方法有一參數type。這個參數表示根據什麼js框架生成javascript,目前Abp提供了Angular與jQuery兩種支持。 api

 

在ScriptProxyManager中會根據不一樣的type調用不一樣的IScriptProxyGenerator生成javascript代碼。以Angular的實現AngularProxyGenerator爲例。 緩存

 

 

        public string Generate()
        {
            var script = new StringBuilder();

            script.AppendLine("(function (abp, angular) {");
            script.AppendLine("");
            script.AppendLine("    if (!angular) {");
            script.AppendLine("        return;");
            script.AppendLine("    }");
            script.AppendLine("    ");
            script.AppendLine("    var abpModule = angular.module('abp');");
            script.AppendLine("    ");
            script.AppendLine("    abpModule.factory('abp.services." + _controllerInfo.ServiceName.Replace("/", ".") + "', [");
            script.AppendLine("        '$http', function ($http) {");
            script.AppendLine("            return new function () {");

            foreach (var methodInfo in _controllerInfo.Actions.Values)
            {
                var actionWriter = CreateActionScriptWriter(_controllerInfo, methodInfo);

                script.AppendLine("                this." + methodInfo.ActionName.ToCamelCase() + " = function (" + GenerateJsMethodParameterList(methodInfo.Method) + ") {");
                script.AppendLine("                    return $http(angular.extend({");
                script.AppendLine("                        abp: true,");
                script.AppendLine("                        url: abp.appPath + '" + actionWriter.GetUrl() + "',");
                actionWriter.WriteTo(script);
                script.AppendLine("                    }, httpParams));");
                script.AppendLine("                };");
                script.AppendLine("                ");
            }

            script.AppendLine("            };");
            script.AppendLine("        }");
            script.AppendLine("    ]);");
            script.AppendLine();

            //generate all methods

            script.AppendLine();
            script.AppendLine("})((abp || (abp = {})), (angular || undefined));");

            return script.ToString();
        }
View Code

 

 

 

AngularProxyGenerator對全部的服務與Action進行了掃描生成javascript。 安全

不過將全部服務都返回到客戶端,好像並不怎麼安全。 session

另外ScriptProxyManager對生成的javascript代碼進行了緩存。 app

 

 

基礎配置

~/AbpScripts/GetScripts對應的則是Abp.Web.Mvc下的AbpScriptsController,AbpScriptsController主要提供一些基礎的配置信息到客戶端。 框架

 

        [DisableAuditing]
        public async Task<ActionResult> GetScripts()
        {
            var sb = new StringBuilder();

            sb.AppendLine(_multiTenancyScriptManager.GetScript());
            sb.AppendLine();

            sb.AppendLine(_sessionScriptManager.GetScript());
            sb.AppendLine();
            
            sb.AppendLine(_localizationScriptManager.GetScript());
            sb.AppendLine();
            
            sb.AppendLine(await _authorizationScriptManager.GetScriptAsync());
            sb.AppendLine();
            
            sb.AppendLine(await _navigationScriptManager.GetScriptAsync());
            sb.AppendLine();
            
            sb.AppendLine(await _settingScriptManager.GetScriptAsync());

            sb.AppendLine(GetTriggerScript());

            return Content(sb.ToString(), "application/x-javascript", Encoding.UTF8);
        }

  

 

這些信息分別是: async

 

接口

實現

說明

IMultiTenancyScriptManager

MultiTenancyScriptManager

多租戶配置

ISettingScriptManager

SettingScriptManager

Abp基礎配置

INavigationScriptManager

NavigationScriptManager

導航信息

ILocalizationScriptManager

LocalizationScriptManager

本地化

IAuthorizationScriptManager

AuthorizationScriptManager

權限

ISessionScriptManager

SessionScriptManager

Session信息

相關文章
相關標籤/搜索