AngularJS依赖注入有什么好处?

时间:2013-05-28 12:49:08

标签: angularjs dependency-injection

我现在已经使用角度一段时间了,而且我没有看到它是如何从我之前的编码方式中得到改进的。

首先,我看不出有一个中心对象来保存你的项目有什么问题,毕竟,注入器是一个单一的,它将你的依赖关系查找到一个中心位置,所以angular确实有一个中心对象,它只是隐。如果正确完成,Namspacing并不意味着耦合。即使完成后,您也不需要将代码中的每个对象与其他对象松散耦合。此外,无论何时创建独立的JS脚本,都必须将其包装成角度,以便让它们一起玩得很好。

其次,每次声明所有依赖性(特别是缩小)是非常冗长的,所以从可读性的角度来看,与正确的命名空间相比,没有任何好处。

第三,性能提升很小。它迫使我到处使用单身,但如果我需要的话,我可以自己做,而且大多数时候,我不这样做(网络和DOM操作是我的瓶颈,而不是JS对象)。

最后,我喜欢“增强型”HTML和自动双向绑定,但我看不出注入如何使其比其他框架处理依赖性的方式更好,因为它甚至没有提供像require.js这样的动态加载。我没有看到任何用例,我对自己说“哦,这是比以前更好的地方,我看到”编码时。

您能否向我解释一下这项技术选择给项目带来了哪些好处?

我现在只能看到一个:常规和最佳实践执行。创建一个lib生态系统是一个很大的问题,但是现在我还没有看到它在角度社区中的成果。

2 个答案:

答案 0 :(得分:6)

对我来说,Angular的依赖注入如何改善我的项目几乎没有方面,我将在此列出。我希望这将向您展示其他人如何从中受益,但如果您是一个组织良好且经验丰富的JS开发人员,那么对您来说可能不是同样的情况。我认为在某种程度上,这只是开发自己的工具和编码指南的问题。

统一,声明性依赖性解析

JS是动态语言(这是新的,对吧?),它为程序员提供了很多权力,甚至更多的责任。组件可以通过各种方式相互交互,传递各种对象:常规对象,单例,函数等。它们甚至可以使用甚至没有提到的代码块供其他组件使用。

JS从来没有(并且很可能永远不会)以统一的方式声明公共,私有或包(模块)范围,就像其他语言一样(Java,C,C#)。当然有一些封装逻辑的方法,但是要求任何新手使用该语言,他根本就不知道如何使用它。

我喜欢DI(不仅在Angular中,而且在一般情况下)是您可以列出组件的依赖关系,并且您不必担心如何构建此依赖关系。这对我来说非常重要,特别是Angular中的DI允许你解决这两种组件:来自框架本身(如$http)或自定义组件(如我最喜欢的eventBus我是用于包装$on事件处理程序)。

我经常看一下服务的声明,我只是通过查看依赖项来了解它的作用以及它是如何做到的!

如果我要构建和/或使用组件本身深处的所有对象,那么我将始终必须彻底分析实现并从各个方面进行检查。如果我在依赖列表中看到localStorage,我知道我正在使用HTML5本地存储来保存一些数据。我不必在代码中查找它。

组件的寿命

我们不再需要打扰某些组件的初始化顺序。如果A取决于B,那么当B需要时,DI会确保A已准备就绪。

单元测试

使用DI时,模拟组件会有很大帮助。例如,如果您有控制器:function Ctrl($scope, a, b, c, d),那么您立即知道它依赖于什么。你注入了适当的模拟,你确保所有参与和控制你的控制器的人都是孤立的。如果您在编写测试时遇到麻烦,那么您很可能搞乱了抽象层次或违反了设计原则(直径法,封装法等)

良好的习惯

是的,您很可能可以使用命名空间来正确管理对象的生命周期。在需要的地方定义单身人士,并确保没有人弄乱你的私人成员。 但老实说,如果框架可以为你做到,你会需要吗? 在我学习Angular之前,我一直没有使用JS“正确的方法”。这不是我不在乎,我只是没有必要,因为我只是为了一些UI的使用JS,主要是基于jquery。

现在它与众不同,我有一个很好的框架,它迫使我跟上一些好的做法,但它也给了我很大的力量来扩展它并利用JS的最佳功能。

当然,糟糕的程序员仍然可以打破最好的工具,但是从我最近读到的D.克罗克福德的“JS好的部分”中学到的东西,人们正在用它做一些令人讨厌的东西。感谢jQuery,Angular和其他很棒的工具,我们现在有了一些很好的工具,可以帮助编写优秀的JS应用程序并坚持最佳实践。

结论

正如您所指出的,您至少可以通过执行以下三项操作来编写优秀的JS应用程序:

  1. 命名空间 - 这可以避免向全局命名空间添加内容,避免潜在的冲突,并允许在需要时轻松解析适当的组件
  2. 创建可重用的组件/模块 - 例如,使用功能模块模式并明确声明私有和公共成员
  3. 管理组件之间的依赖关系 - 通过定义单例,允许从某些“注册表”中检索依赖关系,在某些条件不满足时不允许执行某些操作
  4. Angular只是通过以下方式来做到:

    • $injector管理组件之间的依赖关系并在需要时检索它们
    • 强制使用同时具有PRIVATE和PUBLIC API的工厂功能。
    • 让组件直接相互通信(相互依赖)或共享$scope链。

答案 1 :(得分:0)

我们非常了解 Angular JS 及其在 Web 和移动应用程序开发中使用的各种框架。AngularJS 中的依赖注入提供了一种设计模式,可以在控制反转中实现以解决任何依赖关系。它主要用于定义特定组件、配置模块的块或提供。

要回答有关 AngularJS 依赖注入提供的好处的问题,让我们来看看。

  • 简化学习:具有 HTML、CSS 和 JavaScript 知识的开发人员可以轻松学习 Angular JS 的概念,因为它是一个开源框架,并在网络开发方面开辟了更广泛的机会。
  • 提供对双向绑定功能的访问:AngularJS 允许访问视图和模型的即时同步,为开发人员提供双向绑定数据。在构建应用程序的 UI 时,此过程允许采用一种较少干扰且简单的方法来显示 DOM。
  • 提供对 SPA 功能的支持:AngularJS 广泛支持程序员和开发人员开发单页应用程序 (SPA) 功能。 AngularJS 在应用开发期间提供快速加载时间,并且在各种平台上运行速度相当快。
  • 支持声明式 UI 功能:AngularJS 提供可扩展性和自然的直观性,因此当使用 HTML 创建框架时,它使用声明式语言。这些模板包括 ng-app、ng-repeat、表单控件、ng-model 等。通过声明式 UI,它使开发过程更易于理解和操作。

简而言之,依赖注入意味着模块运行时的依赖功能。当使用 AngularJS 依赖注入时,它有助于在应用程序开发过程中拥有更多可重用的代码,并为应用程序的多个模块提供类似的功能。要了解有关 AngularJS 及其功能的更多信息,您可以访问此处并参与以了解有关 AngularJS 及其功能的更多信息。