我已经实现了一个服务容器,它可以通过reflect-metadata
解析服务容器来创建服务。在代码中说:
// The services
@Service()
export class Bar {
constructor() { console.log('i am bar'); }
}
@Service()
export class Foo {
constructor(bar: Bar) {}
}
// Creating an instance for Foo
Container.get<Foo>('foo');
这导致Foo的已解析实例具有正确注入的Bar
实例。
但是在尝试检测循环依赖时,事情变得非常混乱:
@Service()
export class Foo {
constructor(b: Bar) {}
}
@Service()
export class Bar {
constructor(f: Foo) {}
}
Container.get<Foo>('foo'); // returns Foo, but not with an injected Bar instance
有趣的是Reflect.getMetadata('design:paramtypes', target)
Foo
会返回undefined
。一旦循环依赖变为非循环,就会再次返回正确的类型。
容器实现在这里可能无关紧要,但看到Service
装饰器可能会很有趣:
export const Service = () : ClassDecorator => {
return (target: any): void => {
console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
}
};
这会在依赖关系变为循环后立即记录undefined
,否则会正确返回所需的类型。
我的目标是在循环依赖项上抛出适当的例外 - 但我现在无法检测到它。为什么?以及如何解决这个问题?
答案 0 :(得分:-1)
目前的解决方法,因为我还没有找到解决方案:
注入服务时,我会检查undefined
并抛出ServiceResolvingFailedException
。不完全是我想要的,但至少有一些方法可以告诉开发人员发生了什么。