Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 我可以使用自定义ReflectVenjector策略获取组件提供程序吗?_Angular_Dependency Injection_Angular Di - Fatal编程技术网

Angular 我可以使用自定义ReflectVenjector策略获取组件提供程序吗?

Angular 我可以使用自定义ReflectVenjector策略获取组件提供程序吗?,angular,dependency-injection,angular-di,Angular,Dependency Injection,Angular Di,大家都知道,我们对提供商有不同的策略:useClass,useExisting,useFactory,useValue。但如果我想添加自己的策略呢?比如: providers: [ { MyService: MyService, useAsyncFactory: MyAsyncFactory} ] 扩展ReflectiveInjector并使用扩展变型的最佳方法是什么?我找到了它的定义,但仍在寻找覆盖现有Angular DI机制的方法 附言:请不要问我为什么需要它,为什么不使用现有的策略。我

大家都知道,我们对提供商有不同的策略:
useClass
useExisting
useFactory
useValue
。但如果我想添加自己的策略呢?比如:

providers: [ { MyService: MyService, useAsyncFactory: MyAsyncFactory} ]
扩展ReflectiveInjector并使用扩展变型的最佳方法是什么?我找到了它的定义,但仍在寻找覆盖现有Angular DI机制的方法



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

在引擎盖下Angular不使用
ReflectiveInjector
检索组件提供程序,因此即使您设法扩展ReflectiveInjector,它也不会对组件提供程序产生任何影响。你可以看到:

当组件请求依赖项时调用该方法,例如
ViewContainerRef

class MyComponent {
   constructor(vc: ViewContainerRef)
这一行:

const providerData = asProviderData(view, providerDef.index);
显示从视图节点而不是反射注入器检索依赖关系。所以当你喜欢这个的时候:

constructor(i: Injector) {
   console.log(i instanceOf ReflectiveInjector); // false
}
你会发现那不是真的。包围视图和相关视图节点的Abround
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);
如果无法解决组件或主机视图注入器上的依赖关系,也会咨询模块注入器
有关守则:

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

在引擎盖下,Angular不使用
ReflectiveInjector
检索组件提供程序,因此即使您设法扩展ReflectiveInjector,它也不会对组件提供程序产生任何影响。你可以看到:

当组件请求依赖项时调用该方法,例如
ViewContainerRef

class MyComponent {
   constructor(vc: ViewContainerRef)
这一行:

const providerData = asProviderData(view, providerDef.index);
显示从视图节点而不是反射注入器检索依赖关系。所以当你喜欢这个的时候:

constructor(i: Injector) {
   console.log(i instanceOf ReflectiveInjector); // false
}
你会发现这不是真的。包围视图和相关视图节点的Abround
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);
如果无法解决组件或主机视图注入器上的依赖关系,也会咨询模块注入器
有关守则:

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

那么您想在生产中使用它吗?它不适用于通过组件注册的提供程序,因为Angular不使用ReflectiveInjector来解析组件上的提供程序。这实际上是我的问题:如何使Angular使用自己的注入器而不是ReflectiveInjector Angular不为组件提供商使用任何注入器,看起来我读你的第一条信息不够专心,但你为什么这么说?看,你想在制作中使用它吗?它不适用于通过组件注册的提供程序,因为Angular不使用ReflectiveInjector来解析组件上的提供程序。这实际上是我的问题:如何使Angular使用自己的注入器而不是ReflectiveInjector Angular不为组件提供商使用任何注入器,看起来我读你的第一条信息不够专心,但你为什么这么说呢?看到了吗