2017-08-03 25 views
1

這個問題的框架不可知的方式是「如何使用服務定位器註冊另一個服務?」如何添加另一個供應商到注射器?

Injector被設置爲不可變的,包括接口和實現。

interface Injector { 
    abstract get(token: any, notFoundValue?: any): any; 
} 

接口https://github.com/angular/angular/blob/master/packages/core/src/di/injector.ts 實現https://github.com/angular/angular/blob/master/packages/core/src/di/reflective_injector.ts

你如何添加其他供應商(動態,而不是通過一個模塊)?

Angular在自舉之後如何在加載新模塊時進行此操作,例如通過路由器?

回答

2

爲了提供者添加到您必須通過創建一個新的注射器把它擴大,並通過母公司注入現有的注射器:

class Comp { 
    constructor(existing: Injector) { 
     const newInjector = ReflectiveInjector.resolveAndCreate(providers, existing) 
    } 
} 

如需更多信息閱讀Difference between Reflective Injector and Injector in Angular

Angular在bootstrapping之後加載新模塊時會如何執行此操作,例如通過路由器?

它使用了一點不同的機制。當創建一個新的模塊,例如它通過了母公司注入:

class NgModuleRef_ implements NgModuleData, InternalNgModuleRef<any> {  
    constructor(..., public _parent: Injector) { 
    initNgModule(this); 
    } 

然後當你請求一個令牌,它使用這個父注射器解決依賴關係的,如果它不是在現有的注射器發現:

NgModuleRef_.get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND) { 
    return resolveNgModuleDep(...); 
} 

export function resolveNgModuleDep(...) { 
    ... 
    if (found) return instance; 
    return data._parent.get(depDef.token, notFoundValue); <---------------- 
} 
+0

有趣。看起來這有兩個後果:(1)在引導完成後,你不能將任何注射添加到模塊中(2)你不能在父模塊中請求注入子模塊。因爲它的存在並不知道父噴油器。 –

+0

@ErikvanVelzen,是的,這是絕對正確的 –

+0

@ErikvanVelzen,還有什麼不清楚我的答案? –

相關問題