【发布时间】:2018-09-20 18:41:58
【问题描述】:
我浏览了 Aurelia DI 的文档并查看了源代码,并想分享我正在努力实现的目标,这样如果我遗漏了一些明显的东西,我就可以被击落。我已经查看了带有 Aurelia 的 TS 的示例 here,但我看不出它是如何工作的,并且缺少文档。
我想要的是:
dataProvider.js(数据提供者接口)
export interface DataProvider {
getData(): number;
}
itemDisplayer1.js(一个类会使用一个实现接口的注入类)
import {inject} from 'aurelia-framework';
import {DataProvider} from './dataProvider';
@inject(DataProvider)
export class itemDisplayer1 {
constructor(public dataProvider: DataProvider) {
this.dataProvider = dataProvider;
this.data = dataProvider.getData();
}
}
itemDisplayer2.js(另一个将使用实现接口的注入类的类)
import {inject} from 'aurelia-framework';
import {DataProvider} from './dataProvider';
@inject(DataProvider)
export class itemDisplayer2 {
constructor(public dataProvider: DataProvider) {
this.dataProvider = dataProvider;
this.data = dataProvider.getData();
}
}
GoodDataProvider.js
import {DataProvider} from "./dataProvider";
export class GoodDataProvider implements DataProvider {
data = 1;
getData() {
return this.data;
}
}
BetterDataProvider.js
import {DataProvider} from "./dataProvider";
export class BetterDataProvider implements DataProvider {
data = 2;
getData() {
return this.data;
}
}
然后某处(?)我想配置 itemDisplayer1 应该提供一个 GoodDataProvider 的实例,而 itemDisplayer2 应该提供一个 BetterDataProvider 的实例 (1)。
接着就是 DI 上下文的问题。我不确定如何使用 container.createChild()。我找不到太多关于它的信息。它创建一个子容器,并在需要时将其委托给父容器,但是如果我创建 2 个子容器并为每个子容器注册 2 个提供者之一,那么 itemDisplayer 类如何知道要使用哪个(不更改它们的定义并注入父容器等)?
注意:生命周期管理信息并不存在于依赖项的消费者或提供者中(这通常在 Aurelia DI 示例中完成,并且似乎有些人为制造)。我希望当消费者和提供者关联时能够定义这一点 - 上面的点'(1)'。
总之,这可能吗?这是在不久的将来会出现的事情吗?我是否应该尝试用满足我需求的自定义容器替换 Aurelia DI?
(我之所以这样做是因为为了评估js框架,框架需要展示一个成熟的DI系统,以生命周期管理/AOP等能力作为标准之一)
【问题讨论】:
-
来自 gitter 频道的评论:但在相关说明中,它不能与接口一起使用,因为 TypeScript 在运行时将它们编译掉。
标签: javascript dependency-injection aurelia