Sfondo:
Sto progettando un'applicazione server e creando dll separate per diversi sottosistemi. Per semplificare le cose, supponiamo di avere due sottosistemi: 1) Users
2) Projects
L'interfaccia pubblica degli utenti ha un metodo come:
IEnumerable<User> GetUser(int id);
L'interfaccia pubblica di Projects ha un metodo come:
IEnumerable<User> GetProjectUsers(int projectId);
Quindi, ad esempio, quando abbiamo bisogno di visualizzare gli utenti per un determinato progetto, possiamo chiamare GetProjectUsers
e questo restituirà oggetti con informazioni sufficienti da mostrare in un datagrid o simile.
Problema:
Idealmente, il sottosistema Projects
non dovrebbe inoltre memorizzare informazioni utente e dovrebbe solo memorizzare ID degli utenti che partecipano a un progetto. Per pubblicare GetProjectUsers
, è necessario chiamare GetUser
del sistema Users
per ogni ID utente memorizzato nel proprio database. Tuttavia, ciò richiede molte chiamate GetUser
separate, causando un sacco di query SQL separate all'interno del sottosistema User
. Non ho davvero provato questo, ma avere questo design chiacchierone influenzerà la scalabilità del sistema.
Se metto da parte la separazione dei sottosistemi, I potrebbe memorizzare tutte le informazioni in un unico schema accessibile da entrambi i sistemi e Projects
potrebbe semplicemente fare un JOIN
per ottenere tutti gli utenti del progetto in una singola query. Projects
avrebbe anche bisogno di 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 chiamate individuali di GetUser
durante GetProjectUsers
?
Ad esempio, l'idea che avevo era che gli utenti potessero dare ai sistemi esterni la possibilità di "etichettare" gli utenti con una coppia valore-etichetta e di richiedere agli utenti un determinato valore, per esempio:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Quindi il sistema Projects può taggare ogni utente quando viene aggiunto al progetto:
AddUserTag(userId,"project id", myProjectId.ToString());
e durante GetProjectUsers, potrebbe richiedere a tutti gli utenti del progetto una singola chiamata:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
la parte di cui non sono sicuro è: sì, gli utenti sono agnostici dei progetti, ma in realtà le informazioni sull'appartenenza al progetto sono memorizzate nel sistema Users, non in Projects. Non mi sento naturale, quindi sto cercando di determinare se c'è un grosso svantaggio qui che mi manca.