2012-04-18 51 views
3

我想在工作模式中包含工厂模式。我有一个模块ServiceFactory.js,看起来像这样:授予模块加载其他模块的权限

exports.createService = function(serviceName, paramObj){ 
    return require('Services/'+serviceName).Service.new(paramObj); 
}; 

该模块应该需要其他模块(服务)的名称和创建一个实例。一般Service.js lookes这样的:

const Base = require('base').Base; 

exports.Service = Base.extend({ 
    getName: function(){ 
     return this.name; 
    }, 
    invoke: function(){ 
     //do something 
    }, 
}); 

所有其他服务的扩展基础服务。我在“lib”中的子文件夹“服务”中收集所有服务。当我现在用我厂的createService方法我得到这样一个错误:“模块:服务工厂......没有权力来加载服务/ ...”

有没有办法给予ServiceFactory加载我的权力服务还是有另一种方法来实现我的目标?

回答

2

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

工作,围绕在你的情况会增加一个是从来没有所谓,但拥有所有必要的require()电话,以确保该SDK解决它们的功能:

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

具有这种功能ServiceFactor.js将使确定createService()函数可以要求这些模块。

+0

很好的解决方法。非常感谢。 – 2012-04-18 07:47:23

+0

另一件需要补充的是,目前,如果您在一行中使用任何缩小或多个要求,您的代码就无法正确注册,如var a = require('widget'),b = require('chrome');这已经修复并且正式发布https://github.com/mozilla/addon-sdk/pull/738,但目前它尚未发布在稳定版本中。 – jxpx777 2013-03-28 14:20:19