Ho creato forse cinque servizi come RoleService
, AuthService
, ecc. Ognuno di essi ha uno stato (es. RoleService.role
, AuthService.isLoggedIn
) che influenza molti controller e alcuni altri servizi e direttive.
A volte ho bisogno di $watch
della variabile, quindi la mia soluzione hacky era di mettere l'intero servizio nella $scope
dei controller che ne hanno bisogno. Ho persino inserito uno dei servizi su $rootScope
, il che mi fa sentire male, ma è stato molto pratico.
Qual è la migliore prassi per guardare lo stato del servizio?
Ora ho l'idea di creare un BaseService
come contenitore di dati per tutte le (forse cinque) variabili interessanti. Non ci sarebbero metodi, in quanto appartengono ai servizi in cui sono ora. Questo non suona come OO, ma semplifica le cose e rimuove le dipendenze tra i servizi:
Tutti dipendono dal BaseService
e sarebbero altrimenti indipendenti. Non danneggerà i test poiché BaseService
è banale da riempire con i dati. Non riesco a vedere nessun aspetto negativo, ma non mi sembra giusto.
Questa è una buona idea? Quali alternative migliori esistono?
Nessuno ha risposto, quindi ho provato e funziona bene, nonostante BaseService
aggregando variabili non correlate. Una soluzione pulente teoricamente potrebbe essere quella di creare un titolare di dati per ogni servizio, qualcosa come RoleService + RoleHolderService
, AuthService + AuthStateHolderService
, ecc. Ora, i titolari non dipenderebbero da nulla e il loro contenuto deve essere trattato come letto -solo da tutto oltre al loro servizio di corresponsione, cioè RoleHolderService.role
può essere scritto solo da RoleHolderService
.
In pratica , l'aggregazione di tutti i titolari in un singolo servizio non è un problema. L'informazione se una parte del programma vuole leggere il ruolo dell'utente o se è loggato va persa, ma non è una grande perdita in quanto ci sono così tanti lettori di questo tipo. Controllori e servizi modificando tale stato lo fanno solo tramite un metodo del servizio corrispondente (ad esempio AuthService.login
).