5

按照这个问题

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

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

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

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

4

4 回答 4

11

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

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

您发布的链接表明 DI 可能是动态语言中的反模式。我不同意这一点。我只是说动态语言中不太需要 DI。然而,在 Angular 的情况下,它运行良好。它们允许您组合部件系统,并在需要时只注入您需要的东西。当您查看其他框架的执行方式时,它们(通常)只是在全局空间中为其模型/视图/控制器/模板/路由器部分命名(如 Backbone.js 中的 App.Models.Person)。

我发现 Angular 中的 DI 就像“在罗马时,像罗马人那样做”。接受架构决策。感觉真爽。

于 2013-09-25T09:46:35.937 回答
4

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

于 2013-09-25T14:27:00.270 回答
3

Well, first thing, IoC and DI are two different things (DI is a type of IoC, very popular in static languages). DI isn't very popular in python, but other IoC paradigms are popular, such as Service Locator. Django serve partly as a service locator (for services such as settings, caching, storage, etc..).

You need to remember that Javascript doesn't have any import capabilities (html does, but javascript itself doesn't, though it is planned for ES6), and unlike python, if you want to build modular applications with intricate inner dependencies, you don't have any way in code to describe your dependencies (or get them).
If you don't use somekind of dependency management framework (such as require.js), you are forced to use the global object (or an object inside the global object) as a service locator (which is what other frameworks and plugins do).

选择 DI 而不是 Angular 中的服务定位器是一个设计决定,我猜这是因为两个主要原因 - 首先是单元测试,DI 非常适合单元测试。第二个可能是ES6 模块之类的未来证明。

于 2013-10-12T13:05:46.243 回答
2

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

  • 在测试期间注入测试双打(重载需要功能,如proxyquirekarma-commonjs-plus
  • 在运行时替换服务(使用 browserifyexportsrequire选项)

我还没有找到依赖注入方法提供的一个实例,它不能用普通的 commonJS更简单地完成。

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

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

于 2015-06-23T05:08:42.417 回答