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
相关产品推荐
相关产品推荐

