zoukankan      html  css  js  c++  java
  • ABP之Javascript生成

    还是服务

    在调试SimpleTaskSystem的AngularJs demo时,一开始我只看到对服务的应用。

    app.controller(controllerId, [
    
    '$scope', 'abp.services.tasksystem.task',
    
    function($scope, taskService){}]);
    

      

    在查找源代码中的所有js文件后还是没找到abp.services.tasksystem.task的定义,那么现在就剩下最后一种情况。这些服务是系统生成的,这样的话与动态WebApi的设计思路也是一致的。在layout.cshtml中有两处js引用

    <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就是生成所有服务的一管理者。

    在AbpServiceProxiesController中的GetAll方法有一参数type。这个参数表示根据什么js框架生成javascript,目前Abp提供了Angular与jQuery两种支持。

    在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。

    不过将所有服务都返回到客户端,好像并不怎么安全。

    另外ScriptProxyManager对生成的javascript代码进行了缓存。

    基础配置

    ~/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);
            }
    

      

    这些信息分别是:

    接口

    实现

    说明

    IMultiTenancyScriptManager

    MultiTenancyScriptManager

    多租户配置

    ISettingScriptManager

    SettingScriptManager

    Abp基础配置

    INavigationScriptManager

    NavigationScriptManager

    导航信息

    ILocalizationScriptManager

    LocalizationScriptManager

    本地化

    IAuthorizationScriptManager

    AuthorizationScriptManager

    权限

    ISessionScriptManager

    SessionScriptManager

    Session信息

  • 相关阅读:
    uoj110
    11.28模拟赛D题解
    AT1219 歴史の研究
    P5906 【模板】回滚莫队&不删除莫队
    P4175 [CTSC2008]网络管理
    SP32952 ADAFTBLL
    CF1479D Odd Mineral Resource
    SP10707 COT2
    P4074 [WC2013] 糖果公园
    P6134 [JSOI2015]最小表示
  • 原文地址:https://www.cnblogs.com/gangtianci/p/4696484.html
Copyright © 2011-2022 走看看