通常,在 Aurelia 应用程序中,您是import
ing 不是一个实例Something
这是班级Something
。实际使用已经存在的东西import
ed,你需要它的一个实例。
import Something from 'whatever';
let something = new Something();
当您使用 Aurelia 的依赖注入系统时,您正在利用一种称为“控制反转”的设计模式。它不是由您的类(或您)负责实例化其依赖项,而是列出它具有的依赖项,然后将依赖项的实例注入到其构造函数中。
这有助于提高可测试性,因为现在您可以将依赖项的模拟实例传递给测试装置中的类(请注意,在测试中,您的测试会将模拟传递给构造函数,而不依赖于 Aurelia 的 DI 容器)。这也允许您利用依赖注入容器的功能进行配置,以使用不同的对象生活方式(例如单例和瞬态)创建依赖项。
--- 编辑回答OP的评论问题 ---
如果我将定义为导出默认类 Something 的模块导入到
aurelia 视图模型使用构造函数注入,它不需要
实例化。它是 Something 类的一个实例。
这是因为 Aurelia 的依赖注入容器正在为您实例化一个实例。这就是为什么你的代码看起来像这样:
import {inject} from 'aurelia-framework';
import Something from 'somewhere';
@inject(Something)
export class Foo {
constructor(something) {
this.something = something;
}
//...
}
and not
import Something from 'somewhere';
export class Foo {
constructor(Something) {
this.something = something;
}
//...
}
你告诉奥里莉亚“我需要其中一件,请给我”,奥里莉亚说“当然,我已经创造了一个,或者我已经有一个了,就在这里。”
换句话说,看起来 aurelia 的构造函数 DI 只能工作
使用类导出,并且它确实实例化了该类。看起来像
如果我想将 moment js 之类的东西导入到我的 aurelia 视图中
模型,我应该继续按照我一直做的方式做事
他们(不使用 aurelia 的 DI)。这听起来正确吗?
这是对的。图书馆喜欢moment
为您提供一个要使用的函数,而不是一个可以由 Aurelia 实例化的类。对于这些,您将像过去一样继续使用它们。