在引擎蓋下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);
做,那麼你要在生產中使用它?它不適用於通過組件註冊的供應商,因爲Angular不使用ReflectiveInjector解決組件 –
上的供應商,這實際上是我的問題:如何讓Angular使用您自己的注射器而不是ReflectiveInjector –
Angular不使用任何注射器組件提供商 –