2017-07-18 43 views
3

大家都知道我們對提供商有不同的策略:useClassuseExisting,useFactory,useValue。但是如果我想添加自己的策略呢?喜歡的東西:我可以使用自定義的ReflectiveInjector策略來獲取組件提供程序嗎?

providers: [ { MyService: MyService, useAsyncFactory: MyAsyncFactory} ] 

什麼是最好的方式擴展ReflectiveInjector,使角使用您的擴展的變種?我發現它定義的地方是the place,但仍在尋找覆蓋現有Angular DI機制的方法。


P.S .:請不要問爲什麼我需要它,爲什麼不使用現有的策略。我正在研究Angular DI,答案會幫助我更好地理解它。

+0

做,那麼你要在生產中使用它?它不適用於通過組件註冊的供應商,因爲Angular不使用ReflectiveInjector解決組件 –

+0

上的供應商,這實際上是我的問題:如何讓Angular使用您自己的注射器而不是ReflectiveInjector –

+0

Angular不使用任何注射器組件提供商 –

回答

2

在引擎蓋下Angular不使用ReflectiveInjector來檢索組件提供程序,所以即使您設法擴展ReflectiveInjector它也不會影響組件提供程序。你可以看到它here

function resolveDep(...) { 
     ... 
     default: 
      const providerDef = 
       (allowPrivateServices ? elDef.element !.allProviders : 
             elDef.element !.publicProviders) ![tokenKey]; 
      if (providerDef) { 
      const providerData = asProviderData(view, providerDef.index); 
           ^^^^^^^^^^^^^^^ 
      if (providerData.instance === NOT_CREATED) { 
       providerData.instance = _createProviderInstance(view, providerDef); 
      } 
      return providerData.instance; 
      } 

該方法被調用時,組件請求的依賴,例如ViewContainerRef

class MyComponent { 
    constructor(vc: ViewContainerRef) 

這行:

const providerData = asProviderData(view, providerDef.index); 

表明,依賴檢索從視圖節點,而不是反射型噴射器。所以當你這樣做時:

constructor(i: Injector) { 
    console.log(i instanceOf ReflectiveInjector); // false 
} 

你會發現它不是真的。 It's just a wrapper圍繞resolveDep包圍視圖和相關視圖節點的功能。

反射注射器仍然用於主視圖注射器。這是你通過注射器當實例動態組件:

componentFactory.create(hostViewInjector) 

Here is相關代碼:

const value = startView.root.injector.get(depDef.token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR); 

同時,也是模塊噴油諮詢,如果你的依賴無法在組件上得到解決或主視圖注入器。
Here is相關代碼:

return startView.root.ngModule.injector.get(depDef.token, notFoundValue); 
相關問題