如何使用InversifyJS为自行构建的对象注入@inject装饰属性?
自行构造对象后让InversifyJS完成属性注入的方法
你遇到的问题本质是:当用toConstantValue或toDynamicValue直接提供自行构造的对象时,Inversify容器不会自动对这些对象执行属性注入——属性注入是容器在主动实例化对象(比如用toSelf()、toConstructor())的流程中才会触发的操作,自己new出来的对象默认不会被容器处理。
解决这个问题的简便方法是使用Inversify容器提供的injectUnmanagedInstance方法,它专门用来对外部构造的对象进行属性注入处理。
修改后的示例代码
下面是调整后能通过测试的版本:
import "reflect-metadata"; import { Container, inject, injectable } from "inversify"; const container = new Container(); container.bind(Container).toConstantValue(container); @injectable() class Foo { @inject(Container) public container: Container; } describe("inversify", () => { it("should inject for ctor", () => { // PASS const c = container.createChild(); c.bind(Foo).toSelf(); const result = c.get(Foo); expect(result.container).toBeDefined(); }); it("should inject for dynamic value", () => { // NOW PASS const c = container.createChild(); const foo = new Foo(); c.injectUnmanagedInstance(foo); // 让容器处理属性注入 c.bind(Foo).toDynamicValue(() => foo); const result = c.get(Foo); expect(result.container).toBeDefined(); }); it("should inject for const value", () => { // NOW PASS const c = container.createChild(); const foo = new Foo(); c.injectUnmanagedInstance(foo); // 关键步骤:注入属性 c.bind(Foo).toConstantValue(foo); const result = c.get(Foo); expect(result.container).toBeDefined(); }); });
直接使用注入逻辑(无需绑定到容器)
如果你只是需要给自行构造的对象注入属性,不需要把它绑定到容器供后续get调用,也可以直接调用方法:
const foo = new Foo(); container.injectUnmanagedInstance(foo); // 此时foo.container已经完成注入,可以直接使用
注意事项
- 你的类必须标记
@injectable(),容器才能识别其中的@inject属性装饰器; - 所有被注入的依赖必须已经在容器中完成绑定(比如示例中的
Container已经绑定); - 该方法同样支持嵌套属性的注入,只要对应依赖存在于容器中。
内容的提问来源于stack exchange,提问作者csharptest.net
相关产品推荐
相关产品推荐

