ABP之Javascript生成
还是服务
在调试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信息 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构