我已经浏览了 Aurelia DI 的文档并查看了源代码,并想分享我想要实现的目标,这样如果我遗漏了一些明显的东西,我就可以被击落。我看过样品here https://github.com/cmichaelgraham对于 Aurelia 的 TS,但我不知道它将如何工作,并且缺少文档。
我想要的是:
数据提供者.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 类如何知道要使用哪一个(不更改其定义)并注入父容器等)?
Note:生命周期管理信息并不存在于依赖项的使用者或提供者中(这通常在 Aurelia DI 示例中完成,似乎有点人为制造)。我希望当消费者和提供者关联时能够定义这一点 - 上面的“(1)”点。
综上所述,这可能吗?这是在不久的将来可能发生的事情吗?我是否应该尝试用满足我的需求的自定义容器替换 Aurelia DI?
(我尝试这样做的原因是为了评估js框架,框架需要展示一个成熟的DI系统,并以生命周期管理/AOP等功能作为标准之一)