Il nostro db è ottimizzato per il numero minimo di join (parzialmente denormalizzato). Per esempio. la nostra entità User
contiene i dati dell'account (nickname, ID facebook, ecc.), le statistiche numeriche dell'utente (totale partite giocate, vincite totali, ecc.), le informazioni utente relative alla gilda (ID della gilda, tipo di iscrizione, ecc.) e così via - tutto in la stessa tabella.
Usiamo ORM - NHibernate. La tabella user
è mappata (con tutti i campi) a User
class.
Ora sto rifattorizzando una classe modello AccountManagementService
che offre la possibilità di eseguire alcune azioni su un User
racchiuso. Il modello ha le due dipendenze: NHibernate e l'entità User
. La logica del modello è strettamente legata ai metodi ORM (esegue selezioni, aggiorna).
Penso che sia sbagliato che la modella conosca così tanti campi che non userà. Non ha bisogno di User.GuildId
, statistiche, ecc. Ma dal momento che il modello dovrebbe già usare ORM è logico che dovrebbe conoscere le classi di entità.
Sono anche preoccupato che alcune operazioni con User
debbano essere eseguite solo tramite servizi speciali, ma altri servizi possono teoricamente accedere e modificare qualsiasi campo di User
. Per esempio. AccountManagementService
non dovrebbe cambiare User.Money
direttamente ma usare UserMoneyService
. Ma da un punto di vista del compilatore tale cambiamento è perfettamente valido.
Devo introdurre altri livelli di astrazione tra servizi ed entità per controllare un accesso e come posso farlo? Riesci a vedere altre possibilità per migliorare la situazione?