我想在我的模块中包含工厂模式。我有一个模块ServiceFactory.js
,如下所示:
exports.createService = function(serviceName, paramObj){
return require('Services/'+serviceName).Service.new(paramObj);
};
此模块应按名称要求其他模块(服务)并创建实例。将军Service.js
看起来像这样:
const Base = require('base').Base;
exports.Service = Base.extend({
getName: function(){
return this.name;
},
invoke: function(){
//do something
},
});
所有其他服务扩展基本服务。我在“lib”的子文件夹“Services”中收集所有服务。当我现在使用我工厂的createService
方法时,我收到如下错误:“模块:ServiceFactory ...无权加载Service /...”
有没有办法授予ServiceFactory
加载我的服务的权限,还是有另一种方法来实现我的目标?
答案 0 :(得分:2)
Add-on SDK解决了打包加载项时的所有要求,但不会在运行时发生。我想这主要是出于性能原因(模块可以从多个位置加载,在扩展运行时搜索这些位置可能很慢)但也有安全方面 - 即使模块被泄露(无意中运行代码)它来自网页),它仍然无法加载任何其他模块,特别是chrome
模块。但最终结果是:您无法动态决定要使用哪些模块,只能加载源代码中明确要求的模块。
在你的情况下解决方法是添加一个从未被调用但具有所有必要require()
调用的函数,以确保SDK解析它们:
function dummy()
{
require("Services/ServiceFoo");
require("Services/ServiceBar");
...
}
在ServiceFactor.js
中使用此功能将确保createService()
功能可以要求这些模块。