ABP之Javascript生成 – Barlow Du

还是服务

在调试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两种支持。

 

在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主要提供一些基础的配置信息到客户端。

 

[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信息

 

本文链接:ABP之Javascript生成,转载请注明。



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量