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项目以独立方式使用它吗?
从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)
我对此表示怀疑,看起来它并没有被提取到组件中.有点令人遗憾的是像Angular这样的主要框架仍然采用这种单片方法,我更愿意看到像Symfony这样的面向组件的框架,但JavaScript尚未完全存在.
与此同时,你的InversifyJS看起来并不坏看.
目前 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(); };
}
Run Code Online (Sandbox Code Playgroud)
绑定 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)
解析 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) 支持许多用例:
您可以在https://github.com/inversify/InversifyJS 上了解更多信息
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |