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

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

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


person Ludovic C    schedule 24.12.2015    source источник
comment
В проблеме, которую вы указали, It is not easy to use it as standalone atm and there is no documentation for such setup. There is a plan to extract DI library from the **angular2** repo in the future, but this is not the case today. Также, хорошая шляпа!   -  person 0xcaff    schedule 25.12.2015
comment
Речь идет об angular2 di.   -  person 0xcaff    schedule 25.12.2015
comment
О, я вижу, ты прав. Но сейчас все могло измениться! Angular2 тогда еще не было.   -  person Ludovic C    schedule 25.12.2015
comment
15 октября у нас была альфа 44.   -  person 0xcaff    schedule 25.12.2015
comment
Это изолированный компонент фреймворка, который можно использовать как отдельную систему без Angular 2 blog.oughttram.io/angular/2015/05/18/   -  person Ludovic C    schedule 25.12.2015
comment
В том-то и дело. Я читаю всякую чепуху повсюду. Я хотел бы знать раз и навсегда, могу ли я использовать angular2 Di где-нибудь еще.   -  person Ludovic C    schedule 26.12.2015


Ответы (6)


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

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

person Vincent Pang    schedule 23.01.2017
comment
Только что заметил ваш ответ после того, как добавил эту информацию в свой собственный. Это очень хорошие новости, потому что mgechev является активным разработчиком A2, поэтому репо наверняка будет актуальным. - person Estus Flask; 26.01.2017

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

Вот короткий пример ES6, дружественный к узлам:

// 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);
person Estus Flask    schedule 12.08.2016
comment
спасибо, а почему вы используете Sandwich.parameters=[new Inject(bread)... вместо constructor(new Inject(bread)...) {? - person Max Koretskyi; 16.02.2017
comment
@Maximus parameters статическое свойство - это то, как декораторы преобразуются в ES5 / ES6 (обратите внимание, что для каждого параметра конструктора может быть несколько декораторов, то есть Inject Optional). См. Также angular.io/docs/ ts / latest / cookbook /. - person Estus Flask; 16.02.2017
comment
@Maximus Вы также можете проверить этот вопрос, он касается этого stackoverflow.com/a/39029435/3731501 - person Estus Flask; 16.02.2017
comment
Ясно спасибо. Я думаю, это из-за того, что простой ES6 не поддерживает декораторы, верно? Потому что я только что проверил перенесенный код ES5, и в нем нет parameters. Похоже, это Car = __decorate([ __param(0, injection_js_1.Inject(engine_1.Engine)), - person Max Koretskyi; 16.02.2017
comment
@ Максимус Да. Фреймворк сильно ориентирован на TS, это был лучший общий знаменатель, который они могли придумать. Он выглядит более читабельным с помощью помощника Class, который позволяет аннотировать конструктор массивом в стиле AngularJS. - person Estus Flask; 16.02.2017

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

А пока у вас есть InversifyJS, который выглядит неплохо.

person Théo    schedule 08.08.2016
comment
Неудобно, что DI смешивается с нерелевантными вещами, но основные функции A2 не зависят от платформы, поэтому это должно быть возможно, по крайней мере, просто не уверен, насколько хороши вещи (пакет NPM относительно невелик и содержит предварительные версии). построил ES5 и ES6). Между прочим, у нас уже есть Aurelia DI как компонентная альтернатива, не задокументированная для использования Node. - person Estus Flask; 09.08.2016

На данный момент код Angular 2.0 DI не кажется готовым для использования другими библиотеками.

Хочу предложить альтернативу. Я разработал контейнер IoC под названием InversifyJS с расширенными функциями внедрения зависимостей, такими как контекстные привязки. Он работает как в узле, так и в браузерах, а некоторые части его 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 и браузерах)
  • Модули ядра
  • ПО промежуточного слоя ядра
  • Используйте классы, строковые литералы или символы в качестве идентификаторов зависимостей
  • Введение постоянных значений
  • Внедрение конструкторов классов
  • Инъекция заводов
  • Автозавод
  • Инъекция провайдеров (асинхронная фабрика)
  • Обработчики активации (используются для внедрения прокси)
  • Мульти инъекции
  • Tagged bindings
  • Пользовательские декораторы тегов
  • Именованные привязки
  • Контекстные привязки
  • Дружественные исключения (например, круговые зависимости)

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

person Remo H. Jansen    schedule 13.08.2016
comment
Ответ в некоторой степени виновен в угоне и не затрагивает вопрос напрямую, хотя кажется, что, безусловно, можно использовать Angular 2 DI с Node (см. Мой собственный ответ). Мне лично он понравился, и я нашел его полезным в контексте. - person Estus Flask; 16.08.2016

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

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

person pleerock    schedule 12.08.2016