Angular中的依赖注入如何有用,因为它显然无法解决任何问题?

时间:2018-09-18 12:49:44

标签: angular typescript dependency-injection angular5

这如何改善我的代码?如何消除依赖关系?我仍然看不到使用此功能有什么好处?

@Component({ 
  selector: 'talk-list', 
  templateUrl: 'talks.html', 
  providers: [TalksAppBackend] 
}) 
class TalkList { 
  constructor(backend:TalksAppBackend) { 
    this.talks = backend.fetchTalks(); 
  } 
}

如果我曾经使用过

TalksAppBackend t =新的TalksAppBackend();那将是相同的。除了语法上的差异外,还有什么不同?

更新:

此外,它正在调用.fetchTalks();那不是嘲笑。怎么可能?

3 个答案:

答案 0 :(得分:3)

首先,对于StackOverflow这是一个不好的问题。 但这值得答案。就是这样。

如果您不使用DI

主要区别在于,如果您不使用DI(依赖注入),那么您的代码必须知道如何创建其所有依赖。您需要使用大量的服务来处理大量的组件。服务可能会中继其他服务,例如TalksAppBackend可能需要HttpClient服务。并且您的代码必须为其依赖项创建依赖项。喜欢

TalksAppBackend t = new TalksAppBackend(new HttpClient())

每个组件都必须执行此操作,创建一个TalksAppBackend的新实例和一个HttpClient的实例。并且如果以后TalksAppBackend需要一些日志服务,则必须手动更新所有组件以实例化TalksAppBackend的所有dep。这样的代码很难维护,并且比不应该使用更多的内存,因为它不共享实例。

如果您使用DI

您只需指定负责创建所需依赖项实例的模块或组件。它将也照顾它的依赖关系。您的组件可以只指定要注入的所需类TalksAppBackend,而不必关心它是否需要HttpClientLogger或其他任何东西。 DI负责这项工作。您可以对其进行很好的控制:由模块提供的全局服务将仅被实例化一次。因此,您的组件可以共享同一实例。 而且,如果您愿意,可以在组件级别上提供它,以便可以创建许多实例,并且子组件将只能访问所需的一个实例。

这种方法还开辟了一种模拟依赖关系的方法,它不提供真正的TalksAppBackend服务,而是提供带有虚假答案的模拟,不需要网络通信并运行后端来测试组件是否相应地解释了结果。而且,您无需修改​​组件代码即可做到。因此,在这种方法中,组件只专注于做它应该做的事情。

答案 1 :(得分:0)

这是个好问题。有很多好处。您可以在AngularJS中的同一主题上阅读它:What are the benefits of AngularJS dependancy injection?

但是对我来说,关键是测试。如果您对此组件进行单元测试,则可以简单地注入TalksAppBackend的模拟,然后在单元测试中将组件与其依赖项隔离。通过执行代码中的TalksAppBackend t= new TalksAppBackend();,您将无法对其进行单元测试。

答案 2 :(得分:0)

它有很多好处

  1. 带有新关键字的代码很难在大型应用程序中进行测试。
  2. 重要:考虑您正在使用new关键字实例化一个类。几天后,您想更改/添加参数到依赖类构造函数。然后,您需要在使用同一类的实例的任何地方更改代码。在一个大型项目中这将是一笔不小的数目
  3. 由需要这些依赖关系的类创建的依赖关系实例在该类本地,并且无法共享数据和逻辑