You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:40:42