Почему моя попытка внедрения свойства не вводит ничего, кроме неопределенного? - PullRequest
0 голосов
/ 30 января 2019

У меня есть существующий машинописный проект, использующий inversify.Я определил регистратор в моих ТИПАХ на TYPES.ILoggger, и когда я получаю доступ к регистратору непосредственно из моего контейнера, он работает:

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 не вводится.Но почему и как это исправить?

1 Ответ

0 голосов
/ 30 января 2019

Обычное поведение внедрения свойства - позволить 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"
...