Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字体脚本中的Angular2 DI。我们可以在node.js/非角度项目中使用它吗?_Javascript_Angular_Typescript_Dependency Injection - Fatal编程技术网

Javascript 字体脚本中的Angular2 DI。我们可以在node.js/非角度项目中使用它吗?

Javascript 字体脚本中的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还没有完全实现 同时,你有一个看起来不错的工具。检查资料来源-他在后端集

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

我在10月16日()就di项目发表了一篇文章,我想这应该会成为v2。显然这是不可能的。新的angular2 di怎么了?我可以在js/es6/ts项目中单独使用它吗?

我怀疑。有点遗憾的是,像Angular这样的主要框架仍然有这种单一的方法,我更希望看到像这样的面向组件的框架,但JavaScript还没有完全实现

同时,你有一个看起来不错的工具。

检查资料来源-他在后端集成了angular 2的DI


如果您想为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).{
?@Maximus
parameters
静态属性是如何将装饰程序转换为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样式注释构造函数。这不是和这个答案中提到的库一样吗:?