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

时间:2015-12-24 14:48:14

标签: javascript angular typescript dependency-injection

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

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

6 个答案:

答案 0 :(得分:6)

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

这是一个简短的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);

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

我对此表示怀疑,it doesn't look like it has been extracted into a component。令人遗憾的是像Angular这样的主要框架仍然采用这种单片方法,我更愿意看到像Symfony这样的面向组件的框架,但JavaScript尚未完全存在。

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

答案 3 :(得分:4)

目前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(); };

}

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和浏览器)
  • 内核模块
  • 内核中间件
  • 使用类,字符串文字或符号作为依赖标识符
  • 注入常数值
  • 注入类构造函数
  • 注入工厂
  • 自动工厂
  • 注入提供者(异步工厂)
  • 激活处理程序(用于注入代理)
  • 多次进样
  • 标记绑定
  • 自定义标签装饰器
  • 命名绑定
  • 上下文绑定
  • 友好例外(例如循环依赖)

您可以在https://github.com/inversify/InversifyJS

了解有关此内容的更多信息

答案 4 :(得分:1)

结帐ubiquits来源 - 他以某种方式在后端集成了角度2的DI。

如果你想为typescript和node.js typedi提供简单但功能强大且无痛的依赖注入工具。它也适用于角度前端。还要查看本作者的其他存储库,有很多组件可以帮助您使用TypeScript构建节点应用程序。

答案 5 :(得分:1)

There is an awesome port of the Angular DI: https://github.com/mgechev/injection-js