对于像Java这样的强类型静态语言,IoC / DI框架/工具包对于解耦复杂系统非常有用,因此可以使子组件单元可测试且组成流畅。
我们大多数人都认为Javascript作为松散类型的动态语言已经在精神上提供了IoC / DI的主要优点,而有些人则坚持认为应该采用更高级别的抽象/实现。
对于后者,Javascript领域中常见的IoC / DI实现是什么?
答案 0 :(得分:3)
请查看wire.js。这是我的选择,效果很好。
主要特点是:
- 简单的声明性依赖注入
- 灵活的非侵入式连接基础架构
- 应用程序生命周期管理
- 强大的核心工具和插件架构,用于集成流行的框架和现有代码。
- 支持浏览器和服务器环境
另请查看一些替代方案npm modules for DI
答案 1 :(得分:2)
Javascript的Duck-Typing允许我们轻松地模拟依赖项。
以下是如何执行此操作的简单示例:
我们有一个简单的函数,它表示要添加到数据库中的项目。 DB是我们想要模拟的依赖项。
function SaveItem(item){
var db = new DB();
db.insert(item);
};
如果我们将DB依赖项更改为参数,那么我们可以注入我们想要的任何内容。 调用该函数时,它会检查dataStore参数是否存在。当项存在时,将值分配给db。当dataStore为null或未定义时,则会创建一个新的DB对象。这允许您注入您的依赖项,并确信db将始终具有值。
function SaveItem(item, dataStore){
var db = dataStore || new DB();
db.insert(item);
};
现在我们可以像这样模拟我们的依赖:
function mockDb(){
return{
insert: function(){
assert(true);
}
}
};
并在测试中将它们组合在一起:
function SaveItemShouldCallInsertOnDb = function(){
var testDb = new mockDb();
var someTestItem = { name: "test item" };
SaveItem(someTestItem, testDb);
};
答案 2 :(得分:0)
Angular.js提供了一个很好的IMO依赖管理实现。但是Angular不仅仅是一个DI容器,所以要从中受益,你的应用必须从头开始成为Angular。不过,值得一试,尤其是如果您有大量基于表单的交互。