在引擎盖下,Angular 不ReflectiveInjector
用于检索组件提供程序,因此即使您设法扩展 ReflectiveInjector,它也不会对组件提供程序产生任何影响。你可以在这里看到它:
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
}
你会发现它不是真的。它只是一个封装了resolveDep
视图和相关视图节点的函数。
反射注入器仍然用于主机视图注入器。这是动态实例化组件时传递的注入器:
componentFactory.create(hostViewInjector)
以下是相关代码:
const value = startView.root.injector.get(depDef.token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR);
如果您无法在组件或主机视图注入器上解决依赖关系,还会咨询模块注入器。
以下是相关代码:
return startView.root.ngModule.injector.get(depDef.token, notFoundValue);