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

标签 javascript dependency-injection aurelia

我已经阅读了 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/

相关文章:

c# - 无法将 Autofac 添加到 .Net Core 中的 ServiceCollection

rest - 将 Aurelia 与后端 API 连接

aurelia - 如何使用 ref.view-model 功能

javascript - 在 JavaScript 中重命名文件

javascript - 悬停div jquery

c# - Ninject: Controller 的实体上下文

dependency-injection - 在 Aurelia 中创建使用依赖注入(inject)的类的新实例

javascript - 获取对 JavaScript 中 eval() 期间创建的局部变量的引用

javascript - 使用 $bindTo 两次时遇到问题

c# - 我似乎无法在 WinRT BackgroundTask 中使用依赖注入(inject)