2017-04-18 51 views
2

我正在處理一個Angular應用程序,它有兩種不同類型的後端;一個是在通過普通網頁加載應用程序時使用的,另一個是在Cordova應用程序內部使用的。這樣做的目的是讓應用程序的其餘部分知道它獲取服務,並且只有服務特定於通過AJAX將數據存儲在客戶端或服務器上。有條件地在Angular中加載一組不同的工廠,基於環境

很明顯,我可以使用符號鏈接或我在加載前更改的東西來做到這一點,但我真的很想設置它,以便我可以使用不同的環境配置並使其加載另一組服務。

每個服務將有兩個版本,一個用於「http backend」,另一個用於「移動後端」。兩個版本都將擴展相同的抽象基類或實現相同的接口。

也許最重要的是,應用程序不應該加載未使用的服務集的代碼,所以只需讓代碼決定返回哪個服務就不足夠。

有沒有很好的方法來做到這一點?

回答

2

像這樣的東西應該工作:

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錯誤。

+0

我應該在問題中澄清;僅僅加載正確的提供者集合是不夠的,提供者的大小並不是微不足道的,所以我需要它不加載這兩個集合的代碼 - 我可能需要延遲加載或與默認構建工具綁定的方法當它需要cordova時,它不會加載AJAX提供程序,特別是在它是普通網站時它不會加載cordova提供程序。 – taxilian

+0

我使用CLI在生產環境中構建樹狀結構。例如,當我使用'const DEV_MODULES = environment.production? []:[DevModule]'並導入'DEV_MODULES',在開發模式下捆綁大小爲** + 15.93KB **,生產時爲** + 80B **。您可以設置您的AjaxModule/CordovaModule並根據環境加載它們... – Sasxa

+0

如果您希望針對這兩種情況進行單一構建,則可以使用延遲加載並在此處設置提供程序。 – Sasxa

相關問題