Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Aurelia依赖注入中的容器是什么_Javascript_Dependency Injection_Aurelia - Fatal编程技术网

Javascript Aurelia依赖注入中的容器是什么

Javascript Aurelia依赖注入中的容器是什么,javascript,dependency-injection,aurelia,Javascript,Dependency Injection,Aurelia,我熟悉Aurelia和依赖注入。但是,我不理解Packtpub.com上“Learning Aurelia”一书中依赖注入一章中的以下内容 在Aurelia中,容器可以创建子容器,子容器可以自己创建自己的子容器,从应用程序的根容器开始形成容器树。每个子容器继承其父容器的服务,但可以注册自己的服务以覆盖其父容器的服务 我在书中的示例中使用了DI like: import {PersonService} from 'app-services'; import {Person} from 'mode

我熟悉Aurelia和依赖注入。但是,我不理解Packtpub.com上“Learning Aurelia”一书中依赖注入一章中的以下内容

在Aurelia中,容器可以创建子容器,子容器可以自己创建自己的子容器,从应用程序的根容器开始形成容器树。每个子容器继承其父容器的服务,但可以注册自己的服务以覆盖其父容器的服务

我在书中的示例中使用了DI like:

import {PersonService} from 'app-services'; 
import {Person} from 'models'; 
import {autoinject} from 'aurelia-framework'; 

@autoinject 
export class PersonList { 

constructor(private personService: PersonService) { 
} 

getPeople(){ 
    return this.personService.getAll(); 
 } 
} 
但是这个容器放在哪里呢?我从未在代码中引用过容器。我没有创建任何子容器。它说“每个子容器继承其父容器的服务。”我有许多子组件,它们是独立的视图和视图模型。我不明白容器是怎么装进去的。viewmodels将如何访问父级的服务


我错过什么了吗

通常,您不需要直接引用容器。当需要实例化组件(页面、自定义元素、自定义属性、值转换器等)时,Aurelia将为您处理该问题

DI容器可以看作是一个家族树。有一个应用程序级容器,所有其他容器都是其子容器。每个组件都会获得为其创建的新子容器

您可以使用一些帮助程序向容器提供有关它应该如何处理事情的信息。通过使用
@autoinject
可以获得默认行为,但如果需要更具体一些,可以切换到
@inject
装饰器,执行
@inject(Parent.of(Foo)、Optional.of(Bar))
等操作。这将为您提供在父容器中创建的
Foo
类的实例,并将告诉容器,“我希望有一个Bar实例,但如果您不能为我创建它,那就太好了。”

如果需要访问父级VM,可以使用
parent.of()
在子组件中获取它。请注意,这是“小心处理”类型的事情之一,因为您将子组件直接绑定到父级VM的实现,如果您在具有不同VM类的页面/组件中使用该组件,则该组件将无法创建(并可能使应用程序崩溃)


有关更多信息,请查看我们的文档:

Aurelia有一个依赖项注入容器的实现,用于实例化viewmodels和许多属于框架一部分或由开发人员编写的应用程序服务。通常,您不需要直接使用容器,因为Aurelia的约定系统使用容器代表您构建viewmodels和服务,
@inject
@autoinject
无需手动配置容器

什么是依赖项注入容器?容器是注射器的另一个词:

注入器将服务引入客户端。通常,它还构造客户机。注入器可以将一个非常复杂的对象图连接在一起,方法是将一个对象视为客户端,然后将其视为另一个客户端的服务。喷油器实际上可能是多个对象一起工作,但可能不是客户机。注入器可以用其他名称来表示,例如:汇编程序、提供程序、容器、工厂、生成器、弹簧、构造代码或main。 --

Aurelia的容器系统是分层的,这意味着当您
@inject
@autoinject
某个东西时,将搜索当前(子)容器中的项,如果未找到,则搜索父容器,依此类推,直到找到项或命中根容器,在这种情况下,Aurelia将构造请求项的新实例

在代码段中,您有:

从'app services'导入{PersonService};
从“模型”导入{Person};
从“aurelia框架”导入{autoinject};
@自动注入
导出类个人列表{
构造函数(私有personService:personService){
} 
getPeople(){
返回这个.personService.getAll();
} 
}
假设这是一个自定义元素的视图模型,您正在这样使用:
,下面是Aurelia实例化
PersonList
时将发生的情况

  • 将从当前容器创建子容器(稍后将详细介绍“当前容器是什么”)。相当于调用
    container.createChildContainer()
    。我们将此子容器称为“
    childContainer
  • 上下文项将在子容器中注册,例如PersonList viewmodel的DOM元素(视图)。这相当于调用
    childContainer.registerInstance(元素,PersonListDomainElement)
    。为什么?因为这使开发人员能够
    @inject(Element)
    (或
    @autoinject
    等效项)
  • 配置子容器后,将使用它创建
    PersonList
    的实例。相当于呼叫:

    personList = childContainer.invoke(PersonList);
    childContainer.registerInstance(PersonList, personList);
    
  • 子容器没有使用注册表项“
    PersonService
    ”注册的任何内容,因此将搜索它的父容器,直到找到或找不到它为止,在这种情况下,Aurelia将构造
    PersonService
    的一个新实例,并将其注册到根容器中,以便在后续查找中重用该实例

  • 人员列表视图模型和视图由模板引擎和创建、绑定、附加等生命周期事件组成
  • 奖励:我前面提到过,将从当前容器创建一个子容器。。。每个Aurelia应用程序都有一个“根级别”容器,每个子容器直接或间接地从该容器派生。Aurelia的核心应用程序服务是