在調試SimpleTaskSystem的AngularJs demo時,一開始我只看到對服務的應用。javascript
app.controller(controllerId, [ '$scope', 'abp.services.tasksystem.task', function($scope, taskService){}]);
在查找源代碼中的全部js文件後仍是沒找到abp.services.tasksystem.task的定義,那麼如今就剩下最後一種狀況。這些服務是系統生成的,這樣的話與動態WebApi的設計思路也是一致的。在layout.cshtml中有兩處js引用 html
<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就是生成全部服務的一管理者。 java
在AbpServiceProxiesController中的GetAll方法有一參數type。這個參數表示根據什麼js框架生成javascript,目前Abp提供了Angular與jQuery兩種支持。 api
在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。 安全
不過將全部服務都返回到客戶端,好像並不怎麼安全。 session
另外ScriptProxyManager對生成的javascript代碼進行了緩存。 app
~/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); }
這些信息分別是: async
接口 |
實現 |
說明 |
IMultiTenancyScriptManager |
MultiTenancyScriptManager |
多租戶配置 |
ISettingScriptManager |
SettingScriptManager |
Abp基礎配置 |
INavigationScriptManager |
NavigationScriptManager |
導航信息 |
ILocalizationScriptManager |
LocalizationScriptManager |
本地化 |
IAuthorizationScriptManager |
AuthorizationScriptManager |
權限 |
ISessionScriptManager |
SessionScriptManager |
Session信息 |