如何将另一个提供程序添加到注入器?

时间:2017-08-03 09:08:33

标签: angular dependency-injection angular-di

一种与框架无关的表达问题的方法是"如何使用服务定位器注册另一项服务?"

Injector被设置为不可变的,包括接口和实现。

interface Injector {
    abstract get(token: any, notFoundValue?: any): any;
}

界面https://github.com/angular/angular/blob/master/packages/core/src/di/injector.ts 实施https://github.com/angular/angular/blob/master/packages/core/src/di/reflective_injector.ts

如何添加其他提供程序(动态,不通过模块)?

Angular如何在引导后加载新模块时自行完成此操作,例如通过路由器?

1 个答案:

答案 0 :(得分:4)

为了向现有注射器添加提供者,您必须通过创建新注射器并传递父注射器来扩展它:

class Comp {
   constructor(existing: Injector) {
      const newInjector = ReflectiveInjector.resolveAndCreate(providers, existing)
   }
}

要获取更多详细信息,请阅读Difference between Reflective Injector and Injector in Angular

  

Angular在加载新模块后如何做到这一点   引导,例如通过路由器?

它使用了一点点不同的机制。创建新模块实例时,它会传递父注入器:

class NgModuleRef_ implements NgModuleData, InternalNgModuleRef<any> {    
  constructor(..., public _parent: Injector) {
    initNgModule(this);
  }

然后当您请求令牌时,如果在现有注射器上找不到依赖项,则使用此父注入器来解析依赖关系:

NgModuleRef_.get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND) {
     return resolveNgModuleDep(...);
}

export function resolveNgModuleDep(...) {
  ...
  if (found) return instance;
  return data._parent.get(depDef.token, notFoundValue);  <----------------
}