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