gpt4 book ai didi

angular - Angular 中的依赖注入(inject)如何有用,因为它显然没有解决任何问题?

转载 作者:行者123 更新时间:2023-12-04 02:57:17 24 4
gpt4 key购买 nike

这如何改进我的代码?它如何消除依赖性?我仍然没有看到使用它的任何好处?

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

如果我用过

TalksAppBackend t= new TalksAppBackend();那本来是一样的。除了语法上的差异,它还有什么不同?

更新:

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

最佳答案

首先,这对 StackOverflow 来说是个糟糕的问题。但它值得回答。就是这样。

如果你不使用依赖注入(inject)

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

TalksAppBackend t = new TalksAppBackend(new HttpClient())

并且您的每个组件都必须这样做,创建一个新的 TalksAppBackend 实例和一个 HttpClient 实例。如果稍后 TalksAppBackend 需要一些日志服务,您必须手动更新所有组件以实例化 TalksAppBackend 的所有 dep。此类代码难以维护,并且由于不共享实例,因此使用了比应有的更多内存。

如果你使用依赖注入(inject)

您只需指定负责创建所需依赖项实例的模块或组件。它还会处理它的依赖关系。您的组件可能只指定要注入(inject)的所需类 TalksAppBackend,而不应关心它是否需要 HttpClientLogger 或其他任何内容。 DI 负责这项工作。您可以很好地控制它:模块提供的全局服务将只实例化一次。所以你的组件可以共享同一个实例。如果您愿意,您可以在组件级别提供它,以便可以创建许多实例,并且子组件将可以访问所需的唯一一个实例。

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

关于angular - Angular 中的依赖注入(inject)如何有用,因为它显然没有解决任何问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52386992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com