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

Inversify属性注入返回undefined?问题排查与解决求助

为什么InversifyJS属性注入的Logger在构造函数里是undefined?

这个问题其实是两个关键点导致的,我之前踩过一模一样的坑,给你拆解下:

核心原因1:属性注入的时机晚于构造函数执行

InversifyJS的属性注入是在类的构造函数执行完成之后才会完成的。你在constructor里直接访问this.logger,这时候Inversify还没来得及把Logger实例注入到这个属性里,自然就是undefined。

核心原因2:你直接new了类,没有通过容器获取实例

就算你不在构造函数里访问,直接new ShouldHaveLogger()也不会触发任何注入逻辑——Inversify只有在通过容器(container.get()/container.resolve())创建实例时,才会处理@inject和@injectable的装饰器逻辑。你直接new的话,这个类和普通TS类没区别,注入完全不生效。

修复方案

根据你的需求,有两种常用的解决方式:

方案1:使用@postConstruct装饰器处理初始化逻辑

如果还是想用属性注入,把需要访问注入属性的初始化代码放到@postConstruct修饰的方法里——这个方法会在构造函数执行完毕、所有属性注入完成后自动调用:

import { injectable, inject, postConstruct } from "inversify";
import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";

@injectable()
class ShouldHaveLogger {
    @inject(TYPES.ILogger) private logger: ILogger;

    @postConstruct()
    private init() {
        this.logger.info("Hello World"); // 这里可以正常访问Logger了
    }
}

// 必须通过容器获取实例,不能直接new!
const loggerInstance = container.get<ShouldHaveLogger>(ShouldHaveLogger);

方案2:改用构造函数注入(更推荐)

构造函数注入是Inversify默认的注入方式,它的注入时机是在实例化过程中,所以可以在构造函数里直接使用注入的依赖:

import { injectable, inject } from "inversify";
import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";

@injectable()
class ShouldHaveLogger {
    private logger: ILogger;

    constructor(@inject(TYPES.ILogger) logger: ILogger) {
        this.logger = logger;
        this.logger.info("Hello World"); // 这里完全没问题
    }
}

// 同样要通过容器获取实例
const loggerInstance = container.get<ShouldHaveLogger>(ShouldHaveLogger);

关键提醒

无论用哪种注入方式,绝对不要直接new被@injectable装饰的类,一定要通过Inversify容器来创建实例,否则所有的注入逻辑都不会生效。

内容的提问来源于stack exchange,提问作者k0pernikus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:19:53