zoukankan      html  css  js  c++  java
  • 动态We API层(动态生成js)

    ABP动态webapi前端怎么调用?

    研究abp项目时,页面js文件中一直不明白abp.services... 是从哪里来的

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

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

      

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

    1
    2
    3
    <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();
            }

    AngularProxyGenerator对所有的服务与Action进行了扫描生成javascript。

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

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

    基础配置

    ~/AbpScripts/GetScripts对应的则是Abp.Web.Mvc下的AbpScriptsController,AbpScriptsController主要提供一些基础的配置信息到客户端。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [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信息

  • 相关阅读:
    Vmware15的安装以及Ubunt的在虚拟机上的安装
    MYSQL数据库查询索引
    SpringBoot和mybatis整合报错:Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 152; columnNumber: 10; 元素类型为 "mapper"
    idea中导包出现import org.apach.*,提交代码老出现冲突,不想使用.*的设置
    idea打断点后发现被标记的断点处那一行整行被标记了其他颜色,前面没有断点标识的红点
    Intellj IDEA 光标显示insert状态解决办法
    AngularJS 单元测试 Karma jasmine
    npm 及安装
    AngularJS 承诺 Promise
    AngularJS 路由及SPA理解
  • 原文地址:https://www.cnblogs.com/yaphetsfang/p/9516280.html
Copyright © 2011-2022 走看看