一种与框架无关的表达问题的方法是"如何使用服务定位器注册另一项服务?"
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如何在引导后加载新模块时自行完成此操作,例如通过路由器?
答案 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); <----------------
}