Background:
sto progettando un'applicazione server e creando dll separate per diversi sottosistemi. Per semplificare le cose, diciamo che ho due sottosistemi: 1) Users
2)Projects
L'interfaccia pubblica degli utenti ha un metodo come:
IEnumerable<User> GetUser(int id);
E l'interfaccia pubblica di Projects ha un metodo come:
IEnumerable<User> GetProjectUsers(int projectId);
Quindi, ad esempio, quando abbiamo bisogno di mostrare gli utenti per un determinato progetto, possiamo chiamare GetProjectUsers
e questo restituirà oggetti con informazioni sufficienti per mostrarli in un datagrid o simile.
Problema:
idealmente, il Projects
sottosistema non dovrebbe anche memorizzare le informazioni sugli utenti e dovrebbe semplicemente archiviare gli ID degli utenti che partecipano a un progetto. Per servire il GetProjectUsers
, deve chiamare GetUser
il Users
sistema per ogni ID utente memorizzato nel proprio database. Tuttavia, ciò richiede molte GetUser
chiamate separate , causando molte query sql separate all'interno del User
sottosistema. Non l'ho davvero provato ma avere questo design loquace influenzerà la scalabilità del sistema.
Se metto da parte la separazione dei sottosistemi, potrei archiviare tutte le informazioni in un singolo schema accessibile da entrambi i sistemi e Projects
potrei semplicemente fare una cosa JOIN
per ottenere tutti gli utenti del progetto in una singola query. Projects
dovrebbe anche sapere come generare User
oggetti dai risultati della query. Ma questo rompe la separazione che ha molti vantaggi.
Domanda:
Qualcuno può suggerire un modo per mantenere la separazione evitando tutte queste singole GetUser
chiamate durante GetProjectUsers
?
Ad esempio, una di quelle che penso di avere era che gli utenti potessero dare ai sistemi esterni la possibilità di "taggare" gli utenti con una coppia etichetta-valore e di richiedere agli utenti un certo valore, ad esempio:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Quindi il sistema Progetti potrebbe taggare ciascun utente man mano che vengono aggiunti al progetto:
AddUserTag(userId,"project id", myProjectId.ToString());
e durante GetProjectUsers, potrebbe richiedere tutti gli utenti del progetto in una singola chiamata:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
la parte di cui non sono sicuro è: sì, gli utenti sono agnostici rispetto ai progetti, ma in realtà le informazioni sull'appartenenza al progetto sono archiviate nel sistema Users, non in Progetti. Semplicemente non mi sento naturale, quindi sto cercando di determinare se c'è un grosso svantaggio che mi manca.