【问题标题】:Why I inject service in 2 modules is Singleton Pattern?为什么我在 2 个模块中注入服务是单例模式?
【发布时间】:2020-07-08 21:53:43
【问题描述】:

以下是文件情况

AppService
AppModule
    AModule
        AComponent
    BModule
        BComponent

关于Service,我知道如果我在两个组件中注入Service,Angular 会生成两个不同的服务对象,服务的数据不能共享。如果我在名为 Singleton PatternAppModule 中注入 Service,该服务将共享数据。

但是,如果在AmoduleBModule 中注入Service 会怎样?我认为结果与注入组件相同。但事实是Singleton Pattern

为什么? Service 被注入到两个不同的模块中,我想 Angular 应该在 2 个模块中生成 2 个服务对象。谁能帮我弄清楚?谢谢。

StackBlitz 链接是angular-service-inject-modules

我创建了一个演示,它将输出随机数来检查服务是否为Singleton Pattern

【问题讨论】:

    标签: angular typescript dependency-injection service angular-module


    【解决方案1】:

    当您在模块中提供服务并再次重新导入它时,它在整个应用程序中都可用。您可以通过注释掉 moduleB 中的 providers = [AppService] 来验证这一点,并看到与以前相同的结果。

    在每个单独的组件中提供服务,然后您可以看到注入了服务的新实例,如 working stackblitz 所示。


    在 cmets 中,如果您不希望在您的应用中注入单例服务,您可以完全省略 DI,并在每个组件中创建一个新的服务实例。

    constructor() { this.random = new AppService().random; }
    

    【讨论】:

    • 如果我不使用惰性模块,我希望Singleton Pattern 存在于ModuleA 和ModuleB 中。我该怎么办?
    • 抱歉没有收到您的问题。
    • 在我的stackblitz演示中,如果我在ModuleA和ModuleB中注入服务,服务的模式是单例的。我怎样才能使它在模块A和模块B中成为非单例。我不想注入组件,因为可能moduleA有很多组件,但是ModuleA的组件应该共享服务的数据。
    • 一种选择是在组件级别注入服务,这是首选方式。但是由于您不想那样使用它,您可以在两个组件的构造函数中手动创建一个新实例,即constructor() { this.random = new AppService().random; }
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2023-03-15
    • 2019-12-26
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多