Sto programmando un'applicazione e sto riscontrando problemi nel trovare una buona architettura per alcuni dei suoi componenti.
Come parte dell'app per front-end, ho un sistema di autenticazione utente e un'API che consente agli utenti di eseguire determinate azioni su un server.
Ho creato i seguenti componenti: (Questo è in javascript, ma immagino che l'architettura non sia molto specifica per la lingua)
Un componente che gestisce l'autenticazione con stato (gestisce chi ha effettuato l'accesso e gestisce la memorizzazione e la memorizzazione nella cache dei relativi authtokens)
const Auth = {
logout() { ... }
login() { ... }
isLoggedIn() { ... }
getUsername() { ... }
}
E un componente che gestisce le chiamate API.
const API = {
updateUserSettings() { ... }
getPublicNotifications() { ... }
sendEmail() { ... }
}
Il problema è che queste due componenti sono strettamente accoppiate e hanno una dipendenza circolare. Vedete, perché Auth effettui il login, deve usare l'API per fare una richiesta al server.
const Auth = {
login(email, password) {
...
this.authToken = API.getAuthToken(email, password);
...
}
}
Ma per alcune richieste API (non tutte), l'oggetto API deve recuperare i dati di autenticazione:
const API = {
updateUserSettings(settings) {
...
this.request({ ...settings, authToken: Auth.getAuthToken() });
...
}
}
Non riesco nemmeno a separare questi due componenti distinti nei propri file, poiché quando si importano a vicenda provocano un ciclo infinito a causa della loro relazione circolare.
Come posso affrontare meglio questo problema? Ho pensato di creare un terzo oggetto che avvolge entrambi, ma ho paura di costruire un superoggetto responsabile di troppe cose. Ci sono parte del programma che interagiscono solo con Auth o solo con l'API, rendendo la loro separazione intuitiva.
Ho anche considerato di suddividere l'API nelle parti che toccano la procedura di autenticazione iniziale e i metodi che già presuppongono l'autenticazione. Ma questi due condividono molto in comune, quindi rompere le API sembra un approccio imperfetto. (Ma forse mi sbaglio nel pensarlo così)
Qualsiasi aiuto o idea sarebbe molto apprezzato. Come gestiresti questo?