ABP之Javascript生成
2015-08-02 18:49
549 查看
还是服务
在调试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两种支持。
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信息 |
相关文章推荐
- velocity 直接支持json格式数据
- 高性能javascript读书笔记(三.DOM 编程2)
- 高性能javascript读书笔记(三.DOM 编程1)
- javascript中的美元符号$是做什么的?
- [转]JS弹出确认/取消对话框
- JSON3:JSON与XML数据之间的转换
- [LeetCode][JavaScript]Anagrams
- base64等文本格式
- ArcGIS for Service中JavaScript预览在内网环境无法使用
- 在javascript当中发现了一个没有调用者的方法。
- JSON1:JSON的认识
- 利用JS实现的根据经纬度计算地球上两点之间的距离
- Angular JS
- 06_桥接模式
- JS中的继承链
- JS删除数组条目中重复的条目
- ajax 传值,Ajax: Asynchoronous Javascript and xml (异步的js和xml). 异步刷新,异步传递.替代表单提交数据,回调函数处理返回的数据
- javascript 面向对象角度中对prototype的理解
- javascript:对象类型检查
- 《Javascript语言精粹》的学习(一).对象和函数