Javascript Aurelia依赖注入中的容器是什么
我熟悉Aurelia和依赖注入。但是,我不理解Packtpub.com上“Learning Aurelia”一书中依赖注入一章中的以下内容 在Aurelia中,容器可以创建子容器,子容器可以自己创建自己的子容器,从应用程序的根容器开始形成容器树。每个子容器继承其父容器的服务,但可以注册自己的服务以覆盖其父容器的服务 我在书中的示例中使用了DI like: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
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
”childContainer.registerInstance(元素,PersonListDomainElement)
。为什么?因为这使开发人员能够@inject(Element)
(或@autoinject
等效项)PersonList
的实例。相当于呼叫:
personList = childContainer.invoke(PersonList);
childContainer.registerInstance(PersonList, personList);
PersonService
”注册的任何内容,因此将搜索它的父容器,直到找到或找不到它为止,在这种情况下,Aurelia将构造PersonService
的一个新实例,并将其注册到根容器中,以便在后续查找中重用该实例