Подтвердить что ты не робот

Angular2 DI в Typescript. Можем ли мы использовать его в проектах node.js/non angular?

Был ли контейнер инъекций зависимостей angular2 предназначен для автономного использования, и можно ли использовать его для серверных приложений typescript/javascript?

Я открыл вопрос 16 октября (https://github.com/angular/di.js/issues/108) в проекте di, который, как я предполагал, должен был превратить его в v2. По-видимому, это было невозможно. Что с новым angular2 di? Могу ли я использовать его в автономном режиме с помощью проектов js/es6/ts?

4b9b3361

Ответ 1

Как и в случае с Angular 2 RC.5, DI является частью пакета @angular/core. Для использования без Angular он был недавно извлечен в пакет injection-js Минько Гечевым, членом команды Angular.

Ниже приведен короткий пример ES6, Node:

// may not be needed for injection-js and recent @angular/core versions
// if ES5-flavoured `Class` helper isn't used
require('reflect-metadata');

const { Inject, Injector, ReflectiveInjector, OpaqueToken } = require('@angular/core');
// or ... = require('injection-js');

const bread = new OpaqueToken;
const cutlet = new OpaqueToken;

class Sandwich {
    constructor(bread, cutlet, injector) {
        const anotherBread = injector.get('bread');

        injector === rootInjector;
        bread === 'bread';
        anotherBread === 'bread';
        cutlet === 'cutlet';
    }
}

Sandwich.parameters = [
    new Inject(bread),
    new Inject(cutlet),
    new Inject(Injector)
];

const rootInjector = ReflectiveInjector.resolveAndCreate([
    { provide: 'bread', useValue: 'bread' },
    { provide: bread, useValue: 'bread' },
    { provide: cutlet, useValue: 'cutlet' },
    Sandwich
]);

const sandwich = rootInjector.get(Sandwich);

Ответ 2

Я сомневаюсь, не похоже, что он был извлечен в компонент. Немного грустно, что в основных инфраструктурах, таких как Angular, все еще есть этот монолитный подход, я бы предпочел видеть компоненты, ориентированные на рамки, такие как Symfony, но JavaScript не еще там еще.

Тем временем вы InversifyJS, что не выглядит плохо.

Ответ 3

В настоящий момент код Angular 2.0 DI, похоже, не готов к потреблению другими библиотеками.

Я хотел бы предложить альтернативу. Я разработал контейнер IoC под названием InversifyJS с расширенными функциями инъекции зависимостей, такими как контекстные привязки. Он работает как в node, так и в браузерах, а некоторые части его API основаны на Angular 2 DI API.

Чтобы использовать его, вам необходимо выполнить 3 основных шага:

1. Добавить аннотации

API аннотации основан на Angular 2.0:

import { injectable, inject } from "inversify";

@injectable()
class Katana implements IKatana {
    public hit() {
        return "cut!";
    }
}

@injectable()
class Shuriken implements IShuriken {
    public throw() {
        return "hit!";
    }
}

@injectable()
class Ninja implements INinja {

    private _katana: IKatana;
    private _shuriken: IShuriken;

    public constructor(
        @inject("IKatana") katana: IKatana,
        @inject("IShuriken") shuriken: IShuriken
    ) {
        this._katana = katana;
        this._shuriken = shuriken;
    }

    public fight() { return this._katana.hit(); };
    public sneak() { return this._shuriken.throw(); };

}

2. Объявлять привязки

API привязки основан на Ninject:

import { Kernel } from "inversify";

import { Ninja } from "./entities/ninja";
import { Katana } from "./entities/katana";
import { Shuriken} from "./entities/shuriken";

var kernel = new Kernel();
kernel.bind<INinja>("INinja").to(Ninja);
kernel.bind<IKatana>("IKatana").to(Katana);
kernel.bind<IShuriken>("IShuriken").to(Shuriken);

export default kernel;

3. Разрешить зависимости

API-интерфейс разрешения основан на Ninject:

import kernel = from "./inversify.config";

var ninja = kernel.get<INinja>("INinja");

expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true

Последняя версия (2.0.0) поддерживает множество вариантов использования:

  • Универсальный JavaScript (работает в Node.js и браузерах)
  • Модули ядра
  • промежуточное ПО ядра
  • Использование классов, строковых литералов или символов в качестве идентификаторов зависимостей
  • Инъекция постоянных значений
  • Впрыскивание конструкторов классов
  • Инъекция фабрик
  • Авто factory
  • Инъекция поставщиков (async factory)
  • Обработчики активации (используемые для ввода прокси)
  • Несколько инъекций
  • Отмеченные привязки
  • Декодеры пользовательских тегов
  • Именованные привязки
  • Контекстные привязки
  • Дружественные исключения (например, круговые зависимости)

Подробнее об этом можно узнать на https://github.com/inversify/InversifyJS

Ответ 4

Кажется, кто-то недавно извлек инъекцию зависимостей из Angular2 (январь 2017), что позволяет использовать ее вне рамки.

https://github.com/mgechev/injection-js

Ответ 5

Оформить заказ ubiquits источники - он каким-то образом интегрировал angular 2 DI на бэкэнд.

Если вам нужен простой, но мощный и безболезненный инструмент для инъекций зависимостей для typescript и node.js typedi. Он отлично работает с интерфейсами angular. Также проверьте другие репозитории этого автора, есть много компонентов, которые помогут вам создавать приложения node с помощью TypeScript.