【发布时间】:2019-01-30 10:07:10
【问题描述】:
我有一个使用 inversify 的现有打字稿项目。我在 TYPES.ILoggger 的 TYPES 中定义了一个记录器,当我直接从容器访问记录器时它可以工作:
import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";
const loggerFromTheContainer: ILogger = container.get<ILogger>(TYPES.ILogger);
loggerFromTheContainer.info("I WILL LOG"); // this works
所以我的设置应该没问题。
我不想直接访问容器,但我想使用属性注入。 [InversifyJS'README 提供了一个例子:
如果你喜欢它,你可以使用属性注入而不是构造函数 注入,因此您不必声明类构造函数:
@injectable() class Ninja implements Warrior { @inject(TYPES.Weapon) private _katana: Weapon; @inject(TYPES.ThrowableWeapon) private _shuriken: ThrowableWeapon; public fight() { return this._katana.hit(); } public sneak() { return this._shuriken.throw(); } }
我会尝试跟随那个。
然而当我尝试通过属性注入来注入记录器时,我突然得到undefined作为记录器,我不知道为什么:
@injectable()
class ShouldHaveLogger {
@inject(TYPES.ILogger) private logger: ILogger;
constructor() {
this.logger.info("Hello World"); // this.logger will remain undefined
}
}
new ShouldHaveLogger();
它会抛出一个泛型
TypeError: Cannot read property 'info' of undefined
因为this.logger 没有被注入。但是为什么以及如何解决它?
【问题讨论】: