typescript - Aurelia beroendeinjektion vid instansiering av objekt


Om jag skapar en stödjande klass, t.ex. UserList som har HttpClient injicerad i sig, då kommer den som instansierar den klassen behöva skicka ett HttpClient-objekt till den i konstruktorn. Borde inte @inject(HttpClient) ta hand om att hämta HttpClient-singletonen och injicera den i konstruktorn? Annars kommer varje klass som behöver referera till UserList också behöva få en referens till HttpClient så att den sedan kan skicka den till UserList-konstruktorn (och därmed motverka syftet med injektionen).

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
    }
}

för att få detta att fungera måste jag få en referens till HttpClient i DoSomething-klassen även om den inte kommer att använda den direkt. Den fungerande versionen som verkar vara dåligt implementerad:

DoSomething.ts

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

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

Svar #1

Om du använder TypeScript, oroa dig inte för detta. Använd @autoinject och se magin ske!

Så här:

import {autoinject} from 'aurelia-framework';

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

I annan fil:

import {autoinject} from 'aurelia-framework';

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

TypeScript-kompilatorn kommer att generera typmetadata och Aurelia kommer att läsa detta och injicera instanser på rätt sätt!

Mer information om: http://aurelia.io/docs.html#/aurelia/dependency-injection/1.0.0-beta.1.2.3/doc/article/dependency-injection-basics

Svar #2

Det korrekta sättet att hantera detta är att använda en Factory Resolver

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;
    }
}

För mer information, se svaret som ges i denna relaterade fråga, eller de officiella dokumenten.

Relaterade artiklar