我以前用过这样的方法:
您的库服务应该定义为一个接口,而不是一个具体的实现(在OO语言中经常这样做)。如果您的实现应用程序有时只想传入自己版本的服务,那么您应该在库中创建一个默认服务,并按如下方式使用:
import { Component, NgModule, ModuleWithProviders, Type, InjectionToken, Inject, Injectable } from '@angular/core';
export interface ILibService {
aFunction(): string;
}
export const LIB_SERVICE = new InjectionToken<ILibService>('LIB_SERVICE');
export interface MyLibConfig {
myService: Type<ILibService>;
}
@Injectable()
export class DefaultLibService implements ILibService {
aFunction() {
return 'default';
}
}
@Component({
// whatever
})
export class MyLibComponent {
constructor(@Inject(LIB_SERVICE) libService: ILibService) {
console.log(libService.aFunction());
}
}
@NgModule({
declarations: [MyLibComponent],
exports: [MyLibComponent]
})
export class LibModule {
static forRoot(config?: MyLibConfig): ModuleWithProviders {
return {
ngModule: LibModule,
providers: [
{ provide: LIB_SERVICE, useClass: config && config.myService || DefaultLibService }
]
};
}
}
然后,在实现应用程序中,您可以通过库的
forRoot
方法(请注意
福鲁特
每个应用程序只能调用一次,并且调用级别尽可能高)。注意,我已经标记了
config
参数作为可选参数,因此您应该调用
福鲁特
即使您没有要传递的配置。
import { NgModule, Injectable } from '@angular/core';
import { LibModule, ILibService } from 'my-lib';
@Injectable()
export class OverridingService implements ILibService {
aFunction() {
return 'overridden!';
}
}
@NgModule({
imports: [LibModule.forRoot({ myService: OverridingService })]
})
export class ImplementingModule {
}
这是我的记忆,因为我现在没有代码,所以如果出于任何原因它不起作用,请告诉我。