typescript - Aurelia avhengighetsinjeksjon når man oppretter objekter


Hvis jeg oppretter en støttende klasse, f.eks. UserList, som har HttpClient injisert i seg, må den som instansierer den klassen sende et HttpClient-objekt til konstruktøren. Burde ikke @inject(HttpClient) ta seg av å hente HttpClient-singletonen og injisere den i konstruktøren? Ellers må hver klasse som trenger å referere til UserList også få en referanse til HttpClient slik at den kan sende den til UserList-konstruktøren (og dermed undergrave hensikten med injeksjonen).

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

for å få dette til å fungere må jeg få en referanse til HttpClient i DoSomething-klassen selv om den ikke skal bruke den direkte. Den fungerende versjonen som ser ut til å være dårlig implementert:

DoSomething.ts

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

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

Svar #1

Hvis du bruker TypeScript, ikke bekymre deg for dette. Bruk @autoinject og se magien skje!

Slik:

import {autoinject} from 'aurelia-framework';

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

I en annen fil:

import {autoinject} from 'aurelia-framework';

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

TypeScript-kompilatoren vil sende ut typemetadataene, og Aurelia vil lese dette og injisere instanser på riktig måte!

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

Svar #2

Den riktige måten å håndtere dette på er å bruke 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;
    }
}

For mer informasjon, se svaret gitt i dette relaterte spørsmålet, eller de offisielle dokumentene.

Relaterte artikler