Javascript 字体脚本中的Angular2 DI。我们可以在node.js/非角度项目中使用它吗?
angular2依赖项注入容器是为独立使用而设计的吗?是否可以将其用于typescript/javascript服务器端应用程序 我在10月16日()就di项目发表了一篇文章,我想这应该会成为v2。显然这是不可能的。新的angular2 di怎么了?我可以在js/es6/ts项目中单独使用它吗?我怀疑。有点遗憾的是,像Angular这样的主要框架仍然有这种单一的方法,我更希望看到像这样的面向组件的框架,但JavaScript还没有完全实现 同时,你有一个看起来不错的工具。检查资料来源-他在后端集成了angular 2的DIJavascript 字体脚本中的Angular2 DI。我们可以在node.js/非角度项目中使用它吗?,javascript,angular,typescript,dependency-injection,Javascript,Angular,Typescript,Dependency Injection,angular2依赖项注入容器是为独立使用而设计的吗?是否可以将其用于typescript/javascript服务器端应用程序 我在10月16日()就di项目发表了一篇文章,我想这应该会成为v2。显然这是不可能的。新的angular2 di怎么了?我可以在js/es6/ts项目中单独使用它吗?我怀疑。有点遗憾的是,像Angular这样的主要框架仍然有这种单一的方法,我更希望看到像这样的面向组件的框架,但JavaScript还没有完全实现 同时,你有一个看起来不错的工具。检查资料来源-他在后端集
如果您想为typescript和node.js使用简单但功能强大且毫无痛苦的依赖注入工具。它的作品与角前端太好了。另外,请查看本文作者的其他存储库,有许多组件将帮助您使用TypeScript构建节点应用程序。自Angular 2 RC.5起,DI是Angular/core软件包的一部分。对于非角度用途,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);
目前,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;
import kernel = from "./inversify.config";
var ninja = kernel.get<INinja>("INinja");
expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true
从“inversify”导入{Kernel};
从“/entities/Ninja”导入{Ninja}”;
从“/entities/Katana”导入{Katana}”;
从“/entities/Shuriken”导入{Shuriken}”;
var kernel=新内核();
绑定到(忍者);
内核绑定(“IKatana”)。到(Katana);
kernel.bind(“IShuriken”).to(Shuriken);
导出默认内核;
3.解决依赖关系
分辨率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;
import kernel = from "./inversify.config";
var ninja = kernel.get<INinja>("INinja");
expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true
import kernel=from.“/inversify.config”;
var ninja=kernel.get(“INinja”);
expect(ninja.fight()).eql(“cut!”);//真的
expect(ninja.sleek()).eql(“命中!”);//真的
最新版本(2.0.0)支持许多用例:
- 通用JavaScript(适用于Node.js和浏览器)
- 内核模块
- 核心中间件
- 使用类、字符串文字或符号作为依赖项标识符
- 定值注入
- 类构造函数的注入
- 工厂注资
- 汽车厂
- 提供程序注入(异步工厂)
- 激活处理程序(用于注入代理)
- 多次注射
- 标记绑定
- 自定义标记装饰器
- 命名绑定
- 上下文绑定
- 友好异常(例如循环依赖)
您可以在上了解更多信息。最近(2017年1月),似乎有人从Angular2中提取了依赖注入,这使得它可以在框架之外使用
有一个很棒的角度DI端口:
在您链接的问题中,
将其用作独立atm并不容易,并且没有此类设置的文档。未来有计划从**angular2**repo中提取DI库,但今天的情况并非如此。
还有,不错的帽子!这是关于angular2 di的。哦,我看你是对的。但现在情况可能已经改变了!Angular2当时还没有推出,“它是框架的一个独立组件,可以作为独立系统使用,没有Angular2”就是这样。我到处都在看各种各样的东西。我想知道我是否可以在其他地方使用angular2 Di。Di与不相关的东西混合在一起很不方便,但核心A2功能不依赖于平台,所以至少应该是可能的,只是不确定这些东西有多好(NPM包相对较小,包含预建的ES5和ES6)。顺便说一句,我们已经得到了一个组件化的替代方案,没有针对节点使用的文档记录。答案有点像劫持,没有直接解决这个问题,尽管看起来确实可以将Angular 2 DI用于节点(参见我自己的答案)。我个人很喜欢它,觉得它在上下文中很有用。在我用这些信息更新了我自己的答案后,我注意到了你的答案。这是一个非常好的消息,因为mgechev是一个活跃的A2开发者,所以回购协议肯定是最新的。谢谢,为什么要使用Sandwich.parameters=[new Inject(bread).
而不是constructor(new Inject(bread).{
?@Maximusparameters
静态属性是如何将装饰程序转换为ES5/ES6的(注意,每个构造函数参数可能有多个decorator,即injectoptional).另请参见。@Maximus您也可以检查这个问题,它解决了这个问题,谢谢。我想这是因为普通ES6不支持装饰程序,对吗?因为我刚刚检查了transpiled ES5代码,它没有参数。它看起来像Car=\u装饰([\u参数(0,injection\u js\u 1.injection(engine_1.engine)),
@Maximus是的。这个框架非常面向TS,这是他们能想到的最好的公分母。使用Class
helper,它看起来可读性更强,它允许用数组AngularJS样式注释构造函数。这不是和这个答案中提到的库一样吗:?