我不明白..如果我可以在Aurelia中使用import
,为什么我必须使用@autoinject()
连接构造函数以及所有这些?我确定我错过了一些东西,但是,据我所知,我可以随时使用我导入的模块。
import something from "whatever"
export class SomeViewModel {
activate() {
// use something
}
}
答案 0 :(得分:11)
通常情况下,在Aurelia应用程序中,您import
的事情不是Something
的实例,而是Something
类。要实际使用import
编辑的内容,您需要一个实例。
import Something from 'whatever';
let something = new Something();
当您使用Aurelia的依赖注入系统时,您正在使用名为"控制反转的设计模式。"它不是你的类(或你)负责实例化它的依赖项,而是列出它所依赖的依赖项,然后将依赖项的实例注入到它的构造函数中。
这有助于测试性,因为现在您可以将依赖项的模拟实例传递给测试装置中的类(请注意,在测试中,测试会将模拟传递给构造函数,而不是依赖于Aurelia' s DI容器)。这也允许您利用依赖注入容器的能力配置为使用不同的对象生活方式(如单例和瞬态)创建依赖关系。
---编辑从评论中回答OP的问题---
如果我导入一个模块定义为导出默认类Something into a aurelia视图模型使用构造函数注入,它不需要 实例化。它是Something类的一个实例。
这是因为Aurelia的依赖注入容器正在为您实例化一个实例。这就是您的代码如下所示的原因:
import {inject} from 'aurelia-framework';
import Something from 'somewhere';
@inject(Something)
export class Foo {
constructor(something) {
this.something = something;
}
//...
}
而不是
import Something from 'somewhere';
export class Foo {
constructor(Something) {
this.something = something;
}
//...
}
你在告诉Aurelia"我需要其中一个,请给我,"和Aurelia说"当然,我创造了一个,或者我已经有一个人躺在这里,就在这里。"
换句话说,似乎aurelia的构造函数DI只能工作 使用类导出,它确实实例化了类。看起来像 如果我想将像时刻js这样的东西导入到我的aurelia视图中 模特,我应该继续按照我一直以来的方式做事 他们(不使用aurelia&#DI)。这听起来不错吗?
这是对的。像moment
这样的库为你提供了一个可以使用的函数,而不是一个可以被Aurelia实例化的类。对于这些,你会像过去一样继续使用它们。
答案 1 :(得分:5)
从技术上讲,你可以在没有Aurelia的DI的情况下使用导入的模块,但在大多数情况下这将是一件坏事。依赖注入层为您提供了如此多的功能和灵活性。它处理缓存,它支持单例和瞬态依赖,处理生命周期,并从架构角度使事物更整洁。