gpt4 book ai didi

javascript - 带有 typescript 接口(interface)的 Aurelia DI

转载 作者:可可西里 更新时间:2023-11-01 01:32:55 25 4
gpt4 key购买 nike

我已经阅读了 Aurelia DI 的文档并查看了源代码,并想分享我正在努力实现的目标,这样如果我遗漏了一些明显的东西,我就会被拒绝。我看过样本 here对于 TS with Aurelia,但我看不出它是如何工作的,而且缺少文档。

我想要的是:

dataProvider.js(数据提供者接口(interface))

export interface DataProvider {
getData(): number;
}

itemDisplayer1.js(一个将使用实现接口(interface)的注入(inject)类的类)

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(另一个将使用实现接口(interface)的注入(inject)类的类)

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()。我找不到太多关于它的信息。它创建一个子容器并在需要时委托(delegate)回父容器,但是如果我创建 2 个子容器并向每个子容器注册 2 个提供程序之一,那么 itemDisplayer 类将如何知道使用哪个(不更改它们的定义)并注入(inject)父容器等)?

注意:生命周期管理信息并不存在于依赖项的消费者或提供者中(这通常在 Aurelia DI 示例中完成并且看起来有点人为制造)。我希望这能够在消费者和提供者相关联时定义 - 上面的“(1)”点。

总而言之,这可能吗?这是不久的将来可能发生的事情吗?我是否应该尝试用满足我需求的自定义容器替换 Aurelia DI?

(我尝试这样做的原因是,为了评估 js 框架,框架需要展示一个成熟的 DI 系统,并将生命周期管理/AOP 等功能作为标准之一)

最佳答案

来自@eisenbergeffect:一旦我们编写了基准,DI 将进行一些内部改革。

但在相关说明中,它不能与接口(interface)一起使用,因为 TypeScript 会在运行时将它们编译掉。

当您在 DI 容器中注册不同的类型时,您必须想出唯一键,然后在 @Inject(xxx) 语句中指定适当的唯一键。 key 可以是你喜欢的任何东西。通常人们使用类型本身作为唯一键(这会引起一些混淆),但您可以使用字符串、数字或任何您喜欢的其他内容。

单元测试也提供信息:https://github.com/aurelia/dependency-injection/blob/master/test/container.spec.js

关于javascript - 带有 typescript 接口(interface)的 Aurelia DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30872744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com