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?
Ответы
Ответ 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.
Ответ 6
Существует удивительный порт Angular DI:
https://github.com/mgechev/injection-js