簡體   English   中英

為什么我的屬性注入嘗試除了未定義之外沒有注入任何內容?

[英]Why is my property injection attempt not injecting anything but undefined?

我有一個使用 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沒有被注入。 然而,為什么以及如何解決它?

屬性注入的正常行為是讓inversify為您創建實例。 您現在正在描述一個用例,其中您自己創建了ShouldHaveLogger的實例(或其他庫正在為您創建它)。

文檔也指出了這一點

為了做到這一點,你需要inversify-inject-decorators ,然后你可以通過@lazyInject注入記錄器。

您必須使用您的容器設置 lazyInject,您的代碼應如下所示:

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

const {lazyInject} = getDecorators(container);

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

    constructor() {
        this.logger.info("I am working now");
    }
}

new ShouldHaveLogger();

將根據您的記錄器實現打印:

2019-01-30T09:47:54.890Z - info: "I am working now"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM