这如何改善我的代码?如何消除依赖关系?我仍然看不到使用此功能有什么好处?
@Component({
selector: 'talk-list',
templateUrl: 'talks.html',
providers: [TalksAppBackend]
})
class TalkList {
constructor(backend:TalksAppBackend) {
this.talks = backend.fetchTalks();
}
}
如果我曾经使用过
TalksAppBackend t =新的TalksAppBackend();那将是相同的。除了语法上的差异外,还有什么不同?
更新:
此外,它正在调用.fetchTalks();那不是嘲笑。怎么可能?
答案 0 :(得分:3)
首先,对于StackOverflow这是一个不好的问题。 但这值得答案。就是这样。
如果您不使用DI
主要区别在于,如果您不使用DI(依赖注入),那么您的代码必须知道如何创建其所有依赖。您需要使用大量的服务来处理大量的组件。服务可能会中继其他服务,例如TalksAppBackend
可能需要HttpClient
服务。并且您的代码必须为其依赖项创建依赖项。喜欢
TalksAppBackend t = new TalksAppBackend(new HttpClient())
每个组件都必须执行此操作,创建一个TalksAppBackend的新实例和一个HttpClient的实例。并且如果以后TalksAppBackend
需要一些日志服务,则必须手动更新所有组件以实例化TalksAppBackend
的所有dep。这样的代码很难维护,并且比不应该使用更多的内存,因为它不共享实例。
如果您使用DI
您只需指定负责创建所需依赖项实例的模块或组件。它将也照顾它的依赖关系。您的组件可以只指定要注入的所需类TalksAppBackend
,而不必关心它是否需要HttpClient
或Logger
或其他任何东西。 DI负责这项工作。您可以对其进行很好的控制:由模块提供的全局服务将仅被实例化一次。因此,您的组件可以共享同一实例。
而且,如果您愿意,可以在组件级别上提供它,以便可以创建许多实例,并且子组件将只能访问所需的一个实例。
这种方法还开辟了一种模拟依赖关系的方法,它不提供真正的TalksAppBackend
服务,而是提供带有虚假答案的模拟,不需要网络通信并运行后端来测试组件是否相应地解释了结果。而且,您无需修改组件代码即可做到。因此,在这种方法中,组件只专注于做它应该做的事情。
答案 1 :(得分:0)
这是个好问题。有很多好处。您可以在AngularJS中的同一主题上阅读它:What are the benefits of AngularJS dependancy injection?
但是对我来说,关键是测试。如果您对此组件进行单元测试,则可以简单地注入TalksAppBackend
的模拟,然后在单元测试中将组件与其依赖项隔离。通过执行代码中的TalksAppBackend t= new TalksAppBackend();
,您将无法对其进行单元测试。
答案 2 :(得分:0)
它有很多好处