检测TypeScript中的循环依赖关系
我已经实现了一个服务容器,它能够通过检测TypeScript中的循环依赖关系,typescript,Typescript,我已经实现了一个服务容器,它能够通过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
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');
有趣的是Reflect.getMetadata('design:paramtypes',target)
forFoo
返回未定义的。一旦循环依赖项更改为非循环依赖项,就会再次返回正确的类型
容器实现可能与此无关,但查看服务装饰器可能会很有趣:
export const Service = () : ClassDecorator => {
return (target: any): void => {
console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
}
};
当依赖项变成循环时,它会记录未定义的
,否则会正确返回所需的类型
我的目标是在循环依赖项上抛出一个适当的异常——但我现在不可能检测到。为什么?如何解决这个问题?当前的解决方案,因为我还没有找到解决方案:
注入服务时,我检查未定义的
,并抛出服务ResolvingFailedException
。这不完全是我想要的,但至少可以告诉开发人员发生了什么。我觉得这是反射元数据的一个bug。我所知道的检测类型中使用的循环依赖关系的唯一方法是检查AST。使用我的库,您可以构建类之间所有依赖关系的图,然后在循环引用发生时抛出。或者,有一种方法可以添加一个测试,该测试在design:paramtypes
返回undefined时运行所有类并抛出。我不确定是否可以只使用反射元数据。。。我对它了解得不够。你找到解决方案了吗?在这种情况下,我抛出异常,表明存在循环依赖。
export const Service = () : ClassDecorator => {
return (target: any): void => {
console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
}
};