为什么我的服务会创建其依赖关系的新实例?

时间:2019-02-21 10:30:35

标签: angular dependency-injection

我有一个包含2个组件和2个服务A和B的库。

其中2个组件正在使用我的服务A。那里没问题-我可以看到A已创建一次-我已经在ctor中写到console

服务B需要服务A才能完成工作,为此它注入了A。现在,我在控制台中看到了另一个A的创建

服务B的运行方式与组件的运行方式相同。

import  { A } from './A'
.
.
.
constructor(private myA: A) {...}

但是这一次它再次创建了我的服务A。所以我有2个实例。

这对我不好..而且很奇怪.. 我在新一代的angular中相对较新-而且一直在诸如此类的小问题上挣扎。。这令人沮丧。

有人吗?

更新

我已经意识到,当客户端应用程序延迟加载子模块并将其导入到我的客户端应用程序时,就会发生这种情况。

例如。

partials.modules.ts

@NgModule({ declarations: [..],exports: [...], imports: [ ..., MyModule ]});
export class PartialsModule {}

pages.module.ts -路由延迟加载

@NgModule({ declarations: [..],exports: [...], imports: [ ..., PartialsModule ]});
export class PagesModule {}

app.module.ts

@NgModule({ declarations: [..],exports: [...], imports: [ ..., PartialsModule ]});
export class AppModule {}

app模块正在创建MyMoudle-> my服务以及PagesModule的实例。我猜这是因为惰性模块具有自己的注入器。

但是我该怎么解决呢?

我尝试使用forRoot静态方法将模块的导入移动到 app.module.ts ,如here所述。现在partialModule中的组件无法在MyModule(我的库)中找到组件

:(

2 个答案:

答案 0 :(得分:0)

问题出在哪儿?您是否提供服务?

如果您的提供者处于componet级别,则每次组件初始化时都会得到一个实例

然后,我建议您添加此装饰器,以将根模块指定为提供程序。 @Injectable({ providedIn: 'root' })

或直接在模块中将其指定为: 示例

@NgModule({ declarations: [..],exports: [...], imports: [ ..., MyModule ], providers:[SERVICE_A]});

答案 1 :(得分:0)

经过几天的努力,我正在分享找到的解决方案

我模块中的服务有

// angular 6
@Injectable({
  providedIn: 'root'
})

意味着您的注射剂将在应用程序中注册为单例,并且您无需将其添加到根模块的提供者中,以获取更多信息read here

现在,问题出在.. 我的模块在装饰器中具有provider属性。

@NgModule({
  imports: [...],
  declarations: [...],
  exports: [...],
  providers: [MyService] // <<------- THIS LINE WAS THE PROBLEM - no need for providers in the module
})
export class MyModule { }

只需从模块中删除商品即可解决我的问题。

不需要forRoot方法。

当我的客户使用我的库并导入我的模块时,它调用该模块的ctor的次数与导入时一样多,但是我的服务的ctor被调用一次,这意味着它们共享同一个实例。

相关问题