简体   繁体   English

如何共享服务-NgModule-Angular2

[英]How to share services - NgModule - Angular2

I know that in Angular2, services provided by a module are available to other modules and should be provided only once. 我知道在Angular2中,一个模块提供的服务可用于其他模块,并且只能提供一次。

I have a lazy-loaded MessengerModule which imports a MessengerService. 我有一个惰性加载的MessengerModule,它导入了MessengerService。 I have also a HeaderModule which needs this service only for updating messages notifications. 我还有一个HeaderModule,它仅需要此服务才能更新消息通知。

I see two ways: 我看到两种方式:

  1. Provide MessengerService at the AppModule level 在AppModule级别提供MessengerService
  2. Provide MessengerService in MessengerModule. 在MessengerModule中提供MessengerService。 Import MessengerModule in HeaderModule. 在HeaderModule中导入MessengerModule。

In 1, it is annoying to "break" the MessengerModule by removing its logical service. 在1中,通过删除其逻辑服务来“破坏” MessengerModule很烦人。 In 2, I will lose the lazy loaded feature of MessengerModule which is quite big. 在2中,我将失去MessengerModule的延迟加载功能,该功能相当大。 As HeaderModule is eager loaded, Messenger will be as well right? 急切地加载HeaderModule时,Messenger也将正确吗?

It seems the best choice is to provide the service at the main level. 似乎最好的选择是在主要级别提供服务。 Which are your suggestions? 您有什么建议?

You should read this article. 您应该阅读这篇文章。

It involves: app/shared/shared.module.ts 它涉及: app / shared / shared.module.ts

import { NgModule, ModuleWithProviders } from '@angular/core';
import { CounterService } from './counter.service';

@NgModule({})
export class SharedModule {
  static forRoot(): ModuleWithProvider`enter code here`s {
    return {
      ngModule: SharedModule,
      providers: [CounterService]
    };
  }
}

app/app.module.ts 应用程序/ app.module.ts

import { SharedModule } from './shared/shared.module';

@NgModule({
  imports: [
    SharedModule.forRoot(),
    ...
  ],
  ...
})
export class AppModule {}

Since SharedModule only consists of a service that Angular registers in the root app injector, we do not need to import it in LazyModule. 由于SharedModule仅包含Angular在根应用程序注入器中注册的服务,因此我们无需将其导入LazyModule。 This is because the lazy loaded module will already have access to services defined at the root level. 这是因为延迟加载的模块已经可以访问在根级别定义的服务。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM