打字稿中的Angular2 DI.我们可以在node.js/non-angular项目中使用它吗?

Lud*_*c C 27 javascript dependency-injection typescript angular

angular2依赖注入容器是否为独立使用而设计,是否可以将它用于typescript/javascript服务器端应用程序?

我在10月16日(https://github.com/angular/di.js/issues/108)在di项目上打开了一个问题,我想这应该是进入v2.显然这是不可能的.新的angular2 di有什么用?我可以使用js/es6/ts项目以独立方式使用它吗?

Est*_*ask 6

从Angular 2 RC.5开始,DI是@angular/core封装的一部分.对于非Angular用途,它最近injection-js被Angular团队的成员Minko Gechev 提取到包中.

这是一个简短的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);
Run Code Online (Sandbox Code Playgroud)


Vin*_*ang 6

似乎有人最近(2017年1月)从Angular2中提取了依赖注入,这允许它在框架之外使用.

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


Thé*_*héo 5

我对此表示怀疑,看起来它并没有被提取到组件中.有点令人遗憾的是像Angular这样的主要框架仍然采用这种单片方法,我更愿意看到像Symfony这样的面向组件的框架,但JavaScript尚未完全存在.

与此同时,你的InversifyJS看起来并不坏看.


Rem*_*sen 5

目前 Angular 2.0 DI 代码似乎还没有准备好被其他库使用。

我想提出一个替代方案。我开发了一个名为 InversifyJS 的 IoC 容器,具有高级依赖注入功能,如上下文绑定。它适用于节点和浏览器,其 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(); };

}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

最新版本 (2.0.0) 支持许多用例:

  • 通用 JavaScript(适用于 Node.js 和浏览器)
  • 内核模块
  • 内核中间件
  • 使用类、字符串文字或符号作为依赖标识符
  • 注入常​​数值
  • 注入类构造函数
  • 工厂注塑
  • 汽车厂
  • 提供程序的注入(异步工厂)
  • 激活处理程序(用于注入代理)
  • 多次注射
  • 标记绑定
  • 自定义标签装饰器
  • 命名绑定
  • 上下文绑定
  • 友好异常(例如循环依赖)

您可以在https://github.com/inversify/InversifyJS 上了解更多信息