实例化对象时Aurelia依赖注入

use*_*058 4 dependency-injection typescript aurelia

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

UserList.ts

@inject(HttpClient)
export class UserList {
    constructor(public http: HttpClient){
    }
...
}
Run Code Online (Sandbox Code Playgroud)

DoSomething.ts

export class DoSomething {
    userList: UserList;

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

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

DoSomething.ts

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

    constructor(public http: HttpClient){
         this.userList = new UserList(http); 
    }
}
Run Code Online (Sandbox Code Playgroud)

Abr*_*ves 9

如果你使用打字稿,不要担心这个.使用@autoinject看看魔法发生了!

像这样:

import {autoinject} from 'aurelia-framework';

@autoinject()
export class UserList {
    constructor(private http: HttpClient){
    }
...
}
Run Code Online (Sandbox Code Playgroud)

在其他文件中:

import {autoinject} from 'aurelia-framework';

@autoinject()
export class DoSomething {
    constructor(private userList: UserList){
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*vis 8

处理此问题的正确方法是使用Factory解析器

import { Factory } from 'aurelia-framework';

@inject(Factory.of(UserList))
export class DoSomething {

    userList: UserList;

    constructor(UserList) {

        // this is a factory, so you call the function without new
        this.userList = UserList();
    }
}

@inject(HttpClient)
export class UserList {

    http: HttpClient;

    constructor(HttpClient) {
        this.http = HttpClient;
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此相关问题中给出的答案或官方文档.