像這樣的東西應該工作:
const FirebaseProviders = [
{ provide: AuthService, useClass: FirebaseAuthService },
{ provide: ConnectionService, useClass: FirebaseConnectionService },
{ provide: CrudService, useClass: FirebaseCrudService },
{ provide: ErrorHandler, useClass: FirebaseErrorHandler, deps: [DataService, Store] },
{ provide: StorageService, useClass: FirebaseStorageService },
];
const MockProviders = [
{ provide: AuthService, useClass: MockAuthService },
{ provide: ConnectionService, useClass: MockConnectionService },
{ provide: CrudService, useClass: MockCrudService },
{ provide: ErrorHandler, useClass: AppErrorHandler, deps: [Store] },
{ provide: StorageService, useClass: StorageService },
];
const CoreProviders = environment.production ? FirebaseProviders : MockProviders;
@NgModule({
...
providers: [
...CoreProviders,
DataService
]
})
export class CoreModule {}
確保列出所有依賴於
{ provide: <ServiceA>, useClass: <ServiceB>, deps: [<IMPORTANT for AoT>] }
,或者你:
// service used in components/other services
export class DataService<T> {
constructor(
private connectionService: ConnectionService,
private crudService: CrudService,
private storageService: StorageService,
private store: Store<AppState>) {}
}
,那麼你可以在模塊級提供不同的實現將變得討厭(難以調試)AoT錯誤。
我應該在問題中澄清;僅僅加載正確的提供者集合是不夠的,提供者的大小並不是微不足道的,所以我需要它不加載這兩個集合的代碼 - 我可能需要延遲加載或與默認構建工具綁定的方法當它需要cordova時,它不會加載AJAX提供程序,特別是在它是普通網站時它不會加載cordova提供程序。 – taxilian
我使用CLI在生產環境中構建樹狀結構。例如,當我使用'const DEV_MODULES = environment.production? []:[DevModule]'並導入'DEV_MODULES',在開發模式下捆綁大小爲** + 15.93KB **,生產時爲** + 80B **。您可以設置您的AjaxModule/CordovaModule並根據環境加載它們... – Sasxa
如果您希望針對這兩種情況進行單一構建,則可以使用延遲加載並在此處設置提供程序。 – Sasxa