实例化对象时Aurelia依赖注入

时间:2016-06-06 07:50:06

标签: dependency-injection typescript aurelia

如果我创建一个支持类,例如具有HttpClient的UserList将其注入其中,然后无论谁实例化该类都必须在构造函数中将HttpClient对象传递给它。不应该@inject(HttpClient)负责获取HttpClient单例并将其注入构造函数中吗?否则,每个需要引用UserList的类也将获得对HttpClient的引用,以便它可以将它传递给UserList构造函数(并且无法实现注入的目的)。

UserList.ts

@inject(HttpClient)
export class UserList {
    constructor(public http: HttpClient){
    }
...
}

DoSomething.ts

export class DoSomething {
    userList: UserList;

    constructor(){
         this.userList = new UserList(); //doesn't work without passing HttpClient
    }
}

为了完成这项工作,我必须在DoSomething类中获得对HttpClient的引用,即使它不会直接使用它。工作版似乎执行不力:

DoSomething.ts

@inject(HttpClient)
export class DoSomething {
    userList: UserList;

    constructor(public http: HttpClient){
         this.userList = new UserList(http); 
    }
}

4 个答案:

答案 0 :(得分:9)

如果您使用打字稿,请不要担心这一点。 使用@autoinject看看魔术发生了!

像这样:

import {autoinject} from 'aurelia-framework';

@autoinject()
export class UserList {
    constructor(private http: HttpClient){
    }
...
}

在其他文件中:

import {autoinject} from 'aurelia-framework';

@autoinject()
export class DoSomething {
    constructor(private userList: UserList){
    }
}

TypeScript编译器将发出类型元数据,Aurelia将以正确的方式读取此注入实例!

有关以下内容的更多信息:http://aurelia.io/docs.html#/aurelia/dependency-injection/1.0.0-beta.1.2.3/doc/article/dependency-injection-basics

答案 1 :(得分:7)

处理此问题的正确方法是使用SELECT behaviour.page, behaviour.timestamp, behaviour_actions.page, behaviour_actions.timestamp, behaviour_actions.action FROM behaviour join behaviour_actions on behaviour.hash = behaviour_actions.hash WHERE behaviour.hash = 'abc' 解析器

Factory

有关详细信息,请参阅此related questionofficial docs中给出的答案。

答案 2 :(得分:3)

您需要在DoSomething中注入UserList

import {UserList} from 'where-ever-user-list-is';
import {inject} from 'aurelia-framework';

@inject(UserList)
export class DoSomething {
    userList: UserList;

    constructor(userList){
         this.userList = userList
    }
}

答案 3 :(得分:1)

如果您想使用Aurelia dependency injection,则需要导入所需的模块:

import {HttpClient} from 'aurelia-fetch-client';
import {inject} from 'aurelia-framework';

@inject(HttpClient)
export class DoSomething{

    constructor(http){
        // do your stuff
    }

}

这是我使用的 ES6 实现,但我相信您需要更改的是type中的constructor