Fare in modo che tutti i servizi angolari estendano un unico servizio di base

-1

In Typescript / Angular 6 (2+), è considerata una buona pratica avere un servizio http di base astratto da cui derivano tutti i servizi applicativi? ad esempio:

//import the angular Http ...etc

export abstract class MyBaseService{
  ...
  protected get<T>(url: string): Observable<T> {
      return this.http.get(...)
        .pipe(map(result => result.json() as T));
  }

  protected post<T>....
  ...
}

Fondamentalmente definiamo tutti i metodi di resto (GET, POST, PUT, .. etc)

E poi ogni servizio estende quello di base:

export class MyFirstService extends MyBaseService{
  ...
  public doWork(data: MyModel): Observable<string> {
    this.post<string>('my url', data);
  }
  ...
}
    
posta Uentee 25.05.2018 - 14:56
fonte

2 risposte

1

Preferirei usare Iniezione delle dipendenze invece dell'ereditarietà. Ed ecco perché:

  1. Ogni volta che aggiorni il tuo costruttore MyBaseService (a un certo punto in futuro potresti voler inserire un altro servizio al suo interno, come HttpLogger o AlertService per gestire gli errori, ecc.) devi aggiornare tutte le classi che ne ereditano ( è necessario aggiornare la chiamata super () e iniettare anche queste nuove dipendenze, e queste dipendenze potrebbero essere irrilevanti per la classe figlio).

  2. Che cosa succede se vuoi estendere alcuni dei tuoi servizi da qualcos'altro in futuro, non puoi, perché lo hai già esteso da MyBaseService.

  3. Durante il debug - è più facile ragionare su una singola classe, dato che puoi vedere tutti i metodi in essa contenuti, puoi cogliere facilmente la classe, mentre se hai ereditarietà, devi tenere a mente il genitore comportamento di classe / metodi / oggetti di scena pure. Quindi se l'ereditarietà non fornisce qualcosa di veramente utile, allora DI sembra una scelta migliore.

risposta data 10.06.2018 - 15:40
fonte
1

Penso che l'ereditarietà sarebbe l'approccio migliore quando si tratta di servizi. In Angular non è possibile iniettare un'istanza di un servizio tramite 'provider' in un altro servizio. Invece, tutti i servizi condivideranno la stessa istanza. Di solito va bene; tuttavia, se vuoi che il tuo BaseService faccia di più, come ad esempio gestire gli errori, controlla se la chiamata ha avuto successo, quindi archivia i risultati in modo che il tuo servizio possa afferrare, quindi l'ereditarietà è l'unica opzione reale che hai.

Se ad esempio si utilizza l'iniezione di dipendenza e si sono impostati i valori del proprio archivio di servizi di base e gli si sono resi disponibili e i servizi sono vincolati a questi risultati. Quindi, quello che succederebbe è che tutti i servizi che vi si legano verranno aggiornati.

Quindi a questo punto se avessi Servizio EventService e Messaggi entrambi si aggiornerebbero con gli stessi valori.

    
risposta data 10.09.2018 - 15:54
fonte

Leggi altre domande sui tag