前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态We API层(动态生成js)

动态We API层(动态生成js)

作者头像
yaphetsfang
发布2020-07-30 10:03:25
8.8K0
发布2020-07-30 10:03:25
举报
文章被收录于专栏:yaphetsfangyaphetsfang

ABP动态webapi前端怎么调用?

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

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

代码语言:javascript
复制
app.controller(controllerId, [
 
'$scope', 'abp.services.tasksystem.task',
 
function($scope, taskService){}]);

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

代码语言:javascript
复制
<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为例。

代码语言:javascript
复制
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主要提供一些基础的配置信息到客户端。

代码语言:javascript
复制
[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信息

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ABP动态webapi前端怎么调用?
  • 生成所有服务
  • 基础配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档