我在和丁玲玩。当我使用装饰器时,它似乎工作得很好,但是我无法使它与寄存器函数一起工作。
以下是我尝试过的
测试1:确定
这里我只使用@singleton()装饰器,它的工作很好!
@singleton()
class Child1 {}
@singleton()
class Child2 {}
@singleton()
class Parent {
constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}
const parent = container.resolve(Parent);
expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));测试2:错误
我原以为这和以前的一样。我通过registerSingleton方法注册,而不是通过@singleton()装饰器注册。但是,container.resolve抛出不以“父”错误闻名的TypeInfo。
class Child1 {}
class Child2 {}
class Parent {
constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}
container.registerSingleton(Child1);
container.registerSingleton(Child2);
container.registerSingleton(Parent);
const parent = container.resolve(Parent);
expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));测试3:错误
我也希望这和第一次一样。我通过register方法注册,而不是通过@singleton()装饰器注册。同样,container.resolve抛出不以“父”错误闻名的TypeInfo。
class Child1 {}
class Child2 {}
class Parent {
constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}
container.register(Child1, { useClass: Child1 }, { lifecycle: Lifecycle.Singleton });
container.register(Child2, { useClass: Child2 }, { lifecycle: Lifecycle.Singleton });
container.register(Parent, { useClass: Parent }, { lifecycle: Lifecycle.Singleton });
const parent = container.resolve(Parent);
expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));测试4:好
然后删除构造函数参数并使用register方法。也很好,也很好。
class Parent {}
container.register(Parent, { useClass: Parent }, { lifecycle: Lifecycle.Singleton });
const parent1 = container.resolve(Parent);
const parent2 = container.resolve(Parent);
expect(parent1).toBeInstanceOf(Parent);
expect(parent1).toBe(parent2);问题
我在测试2和3中做错了什么?
更新
我查过注射器单元测试了。在测试构造函数注入的所有情况下,类都使用@injectable()或@singleton()进行修饰。
然后,我发现@injectable()生成了一个typeInfo.set(target, getParamInfo(target)); 打电话 (也是@singleton调用@injectable)。据我所知,这将修饰类的构造函数参数设置为名为typeInfo的全局映射。register或registerSingleton没有打这个电话。因此,当我尝试resolve时,我得到了一个"TypeInfo not“错误。
我不确定这是一个bug还是一个特性。
Update2
据我所知,它既不是一个bug,也不是一个特性。这只是一个限制。Tsyringe中的构造函数参数类型解析依赖于"Reflect.getMetadata“(我认为没有其他东西可以依赖),它只能在使用装饰器时使用。因此,只有由Tysringe的装饰器(如@injectable()、@singleton()等)修饰类的依赖项时,才能注入它。
发布于 2022-10-22 13:05:08
我陷入了太多的麻烦与注射器和倒置。我编写了一个不同的DI lib https://itijs.org/,它更适合我。
https://stackoverflow.com/questions/74064575
复制相似问题