• 动态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信息

  • 相关阅读:
    (Redis基础教程之十) 如何在Redis中运行事务
    (Python基础教程之十三)Python中使用httplib2 – HTTP GET和POST示例
    (Redis基础教程之六)如何使用Redis中的List
    (Redis基础教程之九) 如何在Redis中使用Sorted Sets
    (Python基础教程之十九)Python优先级队列示例
    (Python基础教程之十八)Python字典交集–比较两个字典
    (Python基础教程之十七)Python OrderedDict –有序字典
    Heap_Sort
    Quick_Sort
    Merge_Sort
  • 原文地址:https://www.cnblogs.com/yaphetsfang/p/9516280.html
Copyright © 2020-2023  润新知