gpt4 book ai didi

angular - 我可以使用自定义 ReflectiveInjector 策略来获取组件提供者吗?

转载 作者:太空狗 更新时间:2023-10-29 18:25:04 26 4
gpt4 key购买 nike

众所周知,我们对提供者有不同的策略:useClassuseExistinguseFactoryuseValue。但是如果我想添加自己的策略怎么办?像这样的东西:

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

扩展 ReflectiveInjector 并让 Angular 使用您的扩展变体的最佳方式是什么?我找到了 the place它被定义的地方,但仍在寻找一种方法来覆盖现有的 Angular DI 机制。


P.S.:请不要问我为什么需要它以及为什么不使用现有策略。我正在研究 Angular DI,答案将帮助我更好地理解它。

最佳答案

在幕后,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);

显示依赖是从 View 节点检索的,而不是反射注入(inject)器。所以当你这样做时:

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

你会发现这不是真的。 It's just a wrapper包围 View 和相关 View 节点的 resolveDep 函数。

反射注入(inject)器仍然用于宿主视图注入(inject)器。这是动态实例化组件时传递的注入(inject)器:

componentFactory.create(hostViewInjector)

Here is相关代码:

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

如果您无法在组件或主机 View 注入(inject)器上解决依赖关系,也会咨询模块注入(inject)器。
Here is相关代码:

return startView.root.ngModule.injector.get(depDef.token, notFoundValue);

关于angular - 我可以使用自定义 ReflectiveInjector 策略来获取组件提供者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45161602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com