分层注入器和依赖性生命周期

时间:2016-04-25 13:55:40

标签: angular angular2-routing

使用分层注入时,非根注入器中提供的依赖项的生命周期是多少?

上下文

我的Angular 2应用程序包含几个部分。根组件中有一个@RouteConfig,其中包含指向组件ABC的路由。组件B有一个子@RouteConfig到子xy

/A
/B
  /x
  /y
/C

组件x需要服务q。根据{{​​3}}中的建议,我在组件x级别为注入器提供了服务,即

@xComponent({
    providers: [q]
})
export class xComponent { ... }

服务q在内部请求和缓存一些数据。我的印象是服务是单身,在随后访问/B/x时,数据可以从缓存中获得。但是,通过上述设置,每次用户打开部分/B/x时,都会再次请求数据。我在服务console.log("creating q")的构造函数中添加了q,并且每当访问/B/x时都会看到创建新服务实例。

如果我在组件/B级别提供服务,则在/B/x/B/y之间导航时会缓存该值,但在导航到/A/C

当组件被破坏时,似乎注射器被破坏。这是预期的行为吗?

配置应用程序的正确方法是什么,以便不会重新创建服务?显然我可以在根组件级别提供服务,但也许我错过了什么?

2 个答案:

答案 0 :(得分:2)

Angular2团队成员多次强调DI所维持的实例单身人士(他们认为单身人士的设计模式并不太好)。

相反,Angular2 DI为每个提供商维护一个实例。

Angular还会创建一个类似于组件树的注入器树。

创建组件时,会创建此组件的新子注入器(并在销毁组件时也将其销毁)

子注入器从组件providers:列表中获取自己的一组提供者。

如果子进样器无法找到所请求密钥(令牌或类型)的提供者,它会将请求转发给父进样器。

<强>结论

如果您想确保在您的应用程序中只创建一个服务的单个实例,请使用您的根组件的providers: [...]列表(建议)或bootstrap(...)注册它。

答案 1 :(得分:1)

您完全了解喷油器的行为。它们被添加到组件中并被组件销毁。

因此,在您的情况下,您确实需要将服务添加为全局服务。这将使它成为一个单身&#34;。

其他链接

如果您想了解更多关于angular2中的依赖注入的信息,我可以推荐这篇文章:http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html