我如何告诉依赖注入容器共享一个实例?
How do I tell a Dependency Injection container to share an instance?
我正在使用 Typescript 学习 DI(我在示例中使用了 tsyringe 包)。
如何告诉 DI 容器我想要:
- 每个 FooBar 实例一个新的 Bar 实例(所以没有单例)和
- Foo 应该引用 FooBar 的 Bar 实例吗?
在下面的示例中,tsyringe 创建了两个 Bar 实例(一个在 Foo 中,一个在 FooBar 中)。
it("injects one Bar instance", () => {
@injectable()
class Bar {
constructor() {}
x = 1;
}
@injectable()
class Foo {
constructor(public myBar: Bar) {}
}
@injectable()
class FooBar {
constructor(public bar: Bar, public foo: Foo) {}
}
const fooBar = container.resolve(FooBar);
fooBar.bar.x = 2;
expect(fooBar.foo.myBar).toBe(2); // throws error (is 1)
});
对于 tsyringe,必须使用 @scoped 装饰器:
@scoped(Lifecycle.ResolutionScoped)
class Bar {
constructor() {}
}
我正在使用 Typescript 学习 DI(我在示例中使用了 tsyringe 包)。
如何告诉 DI 容器我想要:
- 每个 FooBar 实例一个新的 Bar 实例(所以没有单例)和
- Foo 应该引用 FooBar 的 Bar 实例吗?
在下面的示例中,tsyringe 创建了两个 Bar 实例(一个在 Foo 中,一个在 FooBar 中)。
it("injects one Bar instance", () => {
@injectable()
class Bar {
constructor() {}
x = 1;
}
@injectable()
class Foo {
constructor(public myBar: Bar) {}
}
@injectable()
class FooBar {
constructor(public bar: Bar, public foo: Foo) {}
}
const fooBar = container.resolve(FooBar);
fooBar.bar.x = 2;
expect(fooBar.foo.myBar).toBe(2); // throws error (is 1)
});
对于 tsyringe,必须使用 @scoped 装饰器:
@scoped(Lifecycle.ResolutionScoped)
class Bar {
constructor() {}
}