angular2依赖注入容器是否为独立使用而设计,是否可以将它用于打字稿/ javascript服务器端应用程序?
我在10月16日(https://github.com/angular/di.js/issues/108)在di项目上打开了一个问题,我想这应该是进入v2。显然这是不可能的。新的angular2 di有什么用?我可以使用js / es6 / ts项目以独立方式使用它吗?
答案 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月),这允许它在框架之外使用。
答案 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个基本步骤来使用它:
注释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(); };
}
绑定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;
决议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)支持许多用例:
答案 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