为什么angularjs需要IoC / DI

Why does angularjs need IoC/DI?

本文关键字:DI IoC 需要 angularjs 为什么      更新时间:2023-09-26

遵循这个问题

https://stackoverflow.com/a/2465052/41948

所以Python不需要IoC/DI,因为它已经是动态脚本语言。

Javascript也是一种动态脚本语言,那么为什么angularjs需要DI?

是因为 JSON <-> DOM 是静态的吗?有人可以给我一个最小的例子吗?

Angular中的依赖注入(DI(并不是一个必要的决定。 大多数其他JavaScript框架都没有内置它。 (虽然看看木偶,一个建立在Backbone之上的框架.js...它包括一个可选的 DI 层(。 Angular.js附带了一组架构意见,可帮助您分离代码。 它是作为设计决策而内置的,而不是必要的。

ANGULAR中有必要使用DI的最大原因是因为这是Angular的工作方式。 角度团队本可以决定使用异步模块定义(AMD(库,如Require.js。 相反,他们选择了一种 DI 模式,并为方便起见将其烘焙。

您发布的链接表明 DI 可能是动态语言中的反模式。 我不同意这种说法。 我只想说DI在动态语言中不太必要。 然而,在Angular的情况下,它工作得很好。 它们允许您组成零件系统,并在需要时仅注入所需的零件。 当你看到其他框架的方式时,它们(通常(只是在全局空间中命名它们的模型/视图/控制器/模板/路由器部分(如 Backbone.js 中的 App.Models.Person (。

我发现 Angular 中的 DI 就像"在罗马时,像罗马人那样做"。 接受架构决策。 感觉很好。

DI 的最佳用例是当您通过测试构建非常大的应用程序时。在这种情况下,您可能会非常模块化,并且有数十个组件可以组合在一起形成一个页面。JavaScript 的经典问题是时间和何时包含脚本,检查它们是否已加载等。DI 消除了这种情况。只要你得到脚本 - 无论你喜欢什么,无论是直接包含还是异步模块加载,捆绑包或组合 - AngularJS将处理其余的。您不必担心顺序,因为 AngularJS 会为您遍历依赖树并以正确的顺序组装组件,您不必担心生命周期管理,因为 AngularJS 会为您维护适当的实例。

首先,IoC 和 DI 是

两个不同的东西(DI 是 IoC 的一种,在静态语言中非常流行(。DI在python中不是很流行,但其他IoC范式很流行,例如Service Locator。Django 部分用作服务定位器(用于设置、缓存、存储等服务(。

你需要记住,Javascript没有任何导入功能(html有,但javascript本身没有,尽管它计划用于ES6(,并且与python不同,如果你想构建具有复杂内部依赖的模块化应用程序,你没有任何方法在代码中描述你的依赖(或获取它们(。
如果您不使用某种依赖管理框架(例如require.js(,则被迫使用全局对象(或全局对象中的对象(作为服务定位器(这是其他框架和插件所做的(。

在角度中选择 DI 而不是服务定位器是一个设计决策,我猜这是因为两个主要原因 - 第一个是单元测试,DI 非常适合单元测试。第二个可能是像ES6模块这样面向未来的东西。

我知道

这是一个古老的问题,但由于仍然有很多人觉得这令人困惑,我想值得一提的是,使用 DI 方法可以完成的所有事情都可以用普通的 CommonJS 完成。或至少以下:

  • 注入测试在测试期间加倍(重载 require 函数,如代理或 karma-commonjs-plus
  • 在运行时替换服务(使用浏览器化exportsrequire选项(

我还没有找到依赖注入方法提供的东西的实例,不能用普通的 commonJS 更简单

当然,如果您不使用commonJSAMD或其他模块化方法,那么您只有角度方法,在这种情况下,您应该评估至少开始使用一个,它将使您的生活变得非常轻松,而无需DI。

也就是说,DI是一个非常强大的概念,一个不容小觑的概念,只是在Javascript中不像在其他语言中那样需要。