angular - Bruke en Provider i en Egendefinert Klasse - Ionic 3
Jeg prøver å implementere noen egendefinerte klasser i mitt Ionic 3-prosjekt for å hjelpe med å håndtere data på en riktig OOP-måte. Men jeg tenker at det jeg prøver å oppnå faktisk er et anti-mønster i Angular og Ionic designmønstre.
For hver bruker ønsker jeg å lage et brukerobjekt. Jeg har en leverandør kalt provider som utfører noen http-kall. Hvert brukerobjekt vil kunne bruke en metode som utfører providers http-kall.
Dette fungerer fint hvis jeg sender Provider gjennom konstruktøren slik:
export class User {
//...various user attributes....
constructor(payload, public provider: Provider){
this.provider.doSomethingHttp(payload).subscribe(val => {
// do something with response
})
}
}
Det fungerer ikke hvis jeg gjør noe sånt som dette:
export class User {
//...various user attributes....
public provider: Provider;
constructor(payload){
this.provider.doSomethingHttp(payload).subscribe(val => {
// do something with response
})
}
}
leverandør er nå undefined.
Hvorfor er dette tilfelle? Må en leverandør sendes gjennom en konstruktør?
Også, hvis jeg oppretter en ny klasse av User et sted, må jeg sende inn argumenter for leverandørene, noe som heller ikke fungerer.
let user = new User(payload, this.provider)
Åpenbart, det ser ut til å finnes en bedre måte å håndtere dette på. Kanskje det er bedre å ikke ha en haug med objekter som driver rundt og lager egne HTTP-kall.
Svar #1
Providerne opprettes av Dependency Injection, og for å ha instansene av dem må du legge dem til i konstruktørene til komponentene dine som i ditt første eksempel og legge dem til i app-modulens providers.
Jeg har aldri sett leverandørene i andre klasser enn komponenter og leverandører, jeg tror at på stedet der du oppretter brukeren (jeg antar det er en komponent eller en leverandør) kan du legge til leverandøren i konstruktøren, og om nødvendig, sende den til User konstruktøren.
Et annet alternativ er å fjerne provideren fra User class, opprette en ny provider (la oss kalle den UserProvider) som vil ha den første provider lagt til i konstruktøren, og i denne nye UserProvider implementere en metode som oppretter brukeren og etter opprettelsen gjør kallet til den første provideren, slik at hver gang du trenger å opprette en User, injiserer du UserProvider og kaller denne metoden.
Svar #2
„Hvorfor er dette tilfellet?”
provider er undefined fordi den aldri blir tildelt.
export class User {
constructor(payload, public provider: Provider) { }
}
er forkortelse for
export class User {
public provider: Provider;
constructor(payload, provider: Provider) {
this.provider = provider;
}
}
«Må en leverandør sendes gjennom en konstruktør?»
Det er en måte, men this.provider = må skje på en eller annen måte, i det minste.
«Selvfølgelig, det ser ut som det finnes en bedre måte å håndtere dette på. Kanskje det er bedre å ikke ha en haug med objekter som svever rundt og gjør sine egne http-kall.»
Som @Octavio Garbarino sa, vanligvis ville du hatt en tjeneste som gjør HTTP-kallet og returnerer User-instansen i for eksempel en getUser(payload): User-metode.
