Angular 向子模块注入不同的服务实现

Angular 向子模块注入不同的服务实现,angular,dependency-injection,Angular,Dependency Injection,我有一个实现ErrorHandler的类,它是在根级别提供的。我的应用程序中有3个模块,其中2个可以在根级别使用ErrorHandler,但其中一个应该有不同版本的ErrorHandler 我尝试创建了两个ErrorHandler的实现,其中一个是在根级别提供的,我用{providedIn:ThreePageModule}装饰了第二个服务,但这似乎不像在出现错误时根级别ErrorHandler启动的那样工作。我看过angular文档,它说当一个子模块被延迟加载时,它将获得提供的服务。我是不是遗漏

我有一个实现ErrorHandler的类,它是在根级别提供的。我的应用程序中有3个模块,其中2个可以在根级别使用ErrorHandler,但其中一个应该有不同版本的ErrorHandler

我尝试创建了两个ErrorHandler的实现,其中一个是在根级别提供的,我用{providedIn:ThreePageModule}装饰了第二个服务,但这似乎不像在出现错误时根级别ErrorHandler启动的那样工作。我看过angular文档,它说当一个子模块被延迟加载时,它将获得提供的服务。我是不是遗漏了什么

下面是app.module.ts

@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
FormsModule,
BrowserModule,
HttpClientModule,
AppRoutingModule
],
providers: [
 ....other services...
{
  provide: HTTP_INTERCEPTORS,
  useClass: HttpConfigInterceptor,
  multi: true
},
{ provide: ErrorHandler, useClass: ExceptionHandlerService },
],
bootstrap: [AppComponent]
})
export class AppModule {}
AppRoutingModule.ts:

@NgModule({
imports: [
 RouterModule.forRoot(appRoutes)
],
exports: [
 RouterModule
]
})
export class AppRoutingModule { }
批准:

 export const appRoutes: Routes = [
   {
    path: 'one',
    loadChildren: './../one/one.module#OnePageModule'
 },
  {
      path: 'two',
      loadChildren: './../two/two.module#TwosPageModule'
  },
  {
    path: 'three',
    loadChildren: './../three/three.module#ThreePageModule'
  }
 ];
三模块

@NgModule({
imports: [
 ...Imports...
],
entryComponents: [
 ThreeComponent
],
providers: [DatePipe],
declarations: [
....Declarations.....
]
})
export class ClaimsPageModule { }
ThreeErrorHandlerService.ts

@Injectable({
  providedIn: ThreePageModule
})
export class ThreeErrorHandlerService implements ErrorHandler {

constructor() { }

handleError(error: Error | HttpErrorResponse): void {
  if (error instanceof HttpErrorResponse) {
   return;
  }
 }
}
我想要的是在ThreePageModule中使用ThreeErrorHandlerService,而在其余两个模块中仍然使用ExceptionHandlerService


这是我们实现目标的方式,还是我做得不对

我认为有一种方法可以做到这一点

app.tokens.ts

导出函数errorHandlerFactory(r:路由器):AbstractErrorHandler{
return r.url=='/foo'?new ErrorHandlerThree('foo error!'):new ErrorHandlerOne('not foo!!'))
}
导出抽象类AbstractErrorHandler{
抽象getCrtErr:()=>字符串;
}
导出类ErrorHandlerOne实现AbstractErrorHandler{
构造函数(公共crtErr:string){}
getCrtErr(){return'err!'}
}
导出类ErrorHandler三个实现AbstractErrorHandler{
构造函数(公共crtErr:string){}
getCrtErr(){return'err!'}
}
app.module.ts
@组件({
选择器:“我的应用程序”,
模板:`
福路
`,
})
类AppComponent{
构造函数(错误:AbstractErrorHandler){
console.log(err)//不是foo!!
}
}
常数路由:路由=[
{path:'foo',loadChildren:()=>import('./foo/foo.module')。然后(m=>m.foodule,)},
]
@NGD模块({
进口:[
浏览器模块,
路由模块forRoot(路由),
],
声明:[
应用组件
],
供应商:[
{提供:AbstractErrorHandler,useFactory:errorHandlerFactory,deps:[路由器]}
],
引导:[AppComponent]
})
导出类AppModule{}
foo.module.ts
@组件({
选择器:“foo comp”,
模板:`这是福!`,
})
出口级食品公司{
构造函数(错误:AbstractErrorHandler){
console.log('foo',err)//foo error!
}
}
常数路由:路由=[
{路径:“”,组件:FooComp,}
]
@NGD模块({
声明:[FooComp],
进口:[
公共模块,
用于儿童的路由模块(路由),
],
供应商:[
{提供:AbstractErrorHandler,useFactory:errorHandlerFactory,deps:[路由器]}
],
请注意,您可能需要在
app.tokens.ts
中跟踪类实例,因为您可能不希望每次组件注入此依赖项时都有一个新实例