splincodewd
@splincodewd
Developer

Как на TypeScript для Nodejs-приложения написать адекватный DI?

Нужно примерно следующее:

startup.ts
export class AppConfiguration {
    constructor() {

    }
}

@CreatableModule({
    services: [AppConfiguration]
})
export class StartupModule {

    constructor(public appConfig: AppConfiguration) {
        console.log(appConfig)
    }

    public f() {
        console.log(this.appConfig)
    }

}


Но у меня не получается понять как работает Inject как в Angular, я вроде как начал писать декоратор, но что-то не получается связать

startup.annotation.ts
export default class Injector {

    private static registry: {[key: string]: any} = {};

    static getRegistered(key: string): any {
        var registered = Injector.registry[key];
        if (registered) {
            return registered;
        } else {
            throw new Error(`Error: ${key} was not registered.`);
        }
    }

    static register(key: string, value: any) {
        var registered = Injector.registry[key];
        if (registered) {
            throw new Error(`Error: ${key} is already registered.`);
        }
        Injector.registry[key] = value;
    }
}

interface ICreatable<T> extends Function {
    new (): T;
    create: (...args) => T;
}

function CreatableModule(options) {
    return function (target) {

        options.services.forEach(service => {
            Injector.register(service.constructor.name, service)
        });

        console.log(options)
        console.log(target)
        target.create = (...args) => new target(...args);
        return target;
    }
}


main.ts
import {StartupModule} from "./app/Startup";

// правда не совсем понимаю как запускать в итоге этот модуль, чтобы он стартовал и у него уже были доступны внутри сервисы
new StartupModule();
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
Если именно необходимо использовать DI, а не написать свой, то можно использовать https://github.com/mgechev/injection-js
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы