3

我想在我的模块中包含工厂模式。我有一个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加载我的服务的权限,或者有没有其他方法可以实现我的目标?

4

1 回答 1

2

附加组件 SDK 在打包附加组件时解决所有要求,它不会在运行时发生。我猜这主要是出于性能原因(模块可以从多个位置加载,在扩展运行时搜索这些位置可能很慢)但也有一个安全方面 - 即使模块受到损害(无意中运行代码它是从网页获得的),它仍然无法加载任何其他模块,尤其是chrome模块。但最终结果是:您无法动态决定要使用哪些模块,您只能加载源代码中明确需要的模块。

在您的情况下,解决方法是添加一个从未调用但具有所有必要require()调用以确保 SDK 解析它们的函数:

function dummy()
{
  require("Services/ServiceFoo");
  require("Services/ServiceBar");
  ...
}

拥有此功能ServiceFactor.js将确保该createService()功能可以需要这些模块。

于 2012-04-18T07:31:33.280 回答