首页 > 解决方案 > 如何添加服务提供商

问题描述

对于一个组件(@Component),我可以使用“providers: []”来添加注入令牌:

export const WINDOW_TOKEN = new InjectionToken<Window>('Window object');

@Component({
  providers: [
    { provide: WINDOW_TOKEN, useValue: window }
  ]
})
export class ExampleClass {
  constructor(@Inject(WINDOW_TOKEN) private windowObj: Window) {}
}

在这种情况下,我不必为这个简单的注入创建另一个服务。此外,这WINDOW_TOKEN将仅在ExampleClass. 更重要的是,我的测试用例可以window.open()通过为windowObj

但是,我怎样才能为服务(@Injectable)做类似的事情?

@Injectable({
  provideIn: 'root'
})
export class ExampleService {
  constructor() {}
}

所以,对于这段代码,我如何创建一个@Inject并且只在 this 中提供ExampleService,而不是创建另一个@Injectable并在根或模块中提供。

标签: angular

解决方案


您只能在模块级或组件级注册服务

取自Angular 文档:提供服务

您必须为您将要使用的任何服务注册至少一个提供商。提供者可以是服务自身元数据的一部分,使该服务随处可用,或者您可以使用特定模块或组件注册提供者。您在服务的元数据中(在 @Injectable() 装饰器中)或在 @NgModule() 或 @Component() 元数据中注册提供程序

当您向特定的 NgModule 注册提供程序时,该 NgModule 中的所有组件都可以使用同一个服务实例。要在此级别注册,请使用 @NgModule() 装饰器的 providers 属性。

当您在组件级别注册提供程序时,您将获得一个新的服务实例以及该组件的每个新实例。在组件级别,在 @Component() 元数据的 providers 属性中注册一个服务提供者。

如果要注入另一个服务范围内的服务,则应将这两个服务封装在同一个模块中。

例如

@NgModule({
   declarations: [],
   imports: [],
   providers: [ServiceA, ServiceB]
})
export class MyModule{}

然后,在您的服务中,您可以注入仅在同一服务范围内可用的服务。

@Injectable({})
export class ServiceA{
  constructor(private sb: ServiceB) {}

  //Service methods
}

推荐阅读