Aurelia 如果奥雷莉亚明白了;进口;,为什么使用依赖注入?

Aurelia 如果奥雷莉亚明白了;进口;,为什么使用依赖注入?,aurelia,Aurelia,我不明白。。如果我可以在Aurelia中使用import,为什么我必须用@autoinject()和所有这些来连接构造函数?我确信我遗漏了一些东西,但是,从我所知道的,我可以随时使用导入的模块 import something from "whatever" export class SomeViewModel { activate() { // use something } } 从技术上讲,您可以在没有Aurelia的DI的情况下使用导入的模块,但在大多数

我不明白。。如果我可以在Aurelia中使用
import
,为什么我必须用
@autoinject()
和所有这些来连接构造函数?我确信我遗漏了一些东西,但是,从我所知道的,我可以随时使用导入的模块

import something from "whatever"

export class SomeViewModel {
    activate() {
        // use something
    }
}

从技术上讲,您可以在没有Aurelia的DI的情况下使用导入的模块,但在大多数情况下,这将是一件坏事。依赖注入层为您提供了如此多的通用性和灵活性。它处理缓存,支持单例依赖和瞬态依赖,处理生命周期,并从体系结构的角度使事情更整洁。

通常,在Aurelia应用程序中,您导入的东西不是
某物的实例,而是类
某物
。要实际使用已导入的内容,您需要一个实例

import Something from 'whatever';

let something = new Something();
当您使用Aurelia的依赖项注入系统时,您使用的是一种称为“控制反转”的设计模式。它不是您的类(或您)负责实例化其依赖项,而是列出它拥有的依赖项,然后将依赖项的实例注入到其构造函数中

这有助于提高可测试性,因为现在您可以将依赖项的模拟实例传递给测试装置中的类(注意,在测试中,您的测试将把模拟传递给构造函数,而不依赖于Aurelia的DI容器)。这还允许您利用依赖项注入容器的功能,将其配置为使用不同的对象生活方式(如单例和瞬态)创建依赖项

---编辑以从评论中回答OP的问题---

如果我将定义为导出默认类的模块导入到 使用构造函数注入的aurelia视图模型,不需要 实例化。它是类某物的一个实例

这是因为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似乎只起作用 使用类导出,它确实实例化了类。看起来像 如果我想在我的aurelia视图中导入像MomentJS这样的东西 模特,我应该继续做我一直做的事情 它们(不使用aurelia的DI)。听起来对吗


这是正确的。像
moment
这样的库为您提供了一个要使用的函数,而不是一个可以由Aurelia实例化的类。对于这些,您将一如既往地继续使用它们

依赖注入是一件好事,它与模块正交。因为没有系统在模块上使用DI,所以我们仍然对构造函数使用DI。“通常,在Aurelia应用程序中,您要导入的东西不是某个东西的实例,而是某个类”,这似乎不是真的。如果我使用构造函数注入将定义为导出默认类某物的模块导入到aurelia视图模型中,则不需要实例化它。它是类
Something
的实例。作为确定aurelia DI功能的测试,我尝试将定义为
export default function which
的模块导入到aurelia视图模型中,但不知道如何使其与aurelia的DI一起工作。换句话说,aurelia的构造函数DI似乎只与类导出一起工作,它确实实例化了这个类。看起来,如果我想将MomentJS之类的东西导入到我的aurelia视图模型中,我应该继续按照我一贯的方式进行操作(而不是使用aurelia的DI)。这听起来正确吗?我在上面的回答中回答了这些问题。请澄清或更正“通常,在Aurelia应用程序中,您导入的东西不是某个东西的实例,而是某个类。要实际使用导入的任何东西,您必须实例化它的实例。”这听起来和你想说的正好相反。而且,据我的理解,aurelia的DI对可测试性的帮助不亚于导入模块。很长一段时间以来,人们一直在用requirejs模拟模块依赖关系。如果您的aurelia模块需要像矩这样的老派模块,那么如果您想要模拟这些依赖关系,您仍然必须回到那些旧技术。看起来aurelia的DI唯一能让你做的就是在运行时确定你是想要一个瞬态实例还是单例实例。如果我错了,请纠正我。我希望这个答案能帮助尽可能多的人。