Sono nel mezzo di una riprogettazione da parte del mio attuale progetto che riguarda le autorizzazioni e l'autorizzazione degli utenti. Ho un'interfaccia chiamata IUserPermissions
che incapsula questa informazione.
Una parte delle autorizzazioni di un utente sono i ruoli di cui sono membri. Sto provando non a violare il principio aperto / chiuso aggiungendo ogni possibile ruolo a IUserPermissions
come una proprietà come questa:
interface IUserPermissions {
bool IsAdmin { get; set; }
bool IsDeveloper { get; set; }
// Many more...Yuck.
}
Sento che avere un'interfaccia come questa potrebbe soddisfare meglio l'OCP:
interface IUserPermissions {
ICollection<IRole> Roles { get; }
bool IsInRole<T>() where T : IRole; /* (For convenience; Would probably be
implemented as an extension method) */
}
interface IRole {
string Name { get; }
}
public class AdminRole : IRole {
public string Name { get { return "Admin"; } }
}
Dove mi trovo a cadere è come implementare qualcosa come questo. Sto usando l'API dei ruoli ASP.NET come backing store, il che significa che riceverò un string[]
di nomi di ruolo per l'utente. La mia implementazione IUserPermissions
dovrebbe iniziare con questa raccolta di stringhe e in qualche modo lavorare indietro , quindi istanziare un gruppo di IRole
s appropriato per popolare la proprietà Roles
.
Questo potrebbe essere fatto scansionando l'assembly per IRoles
con un costruttore senza parametri, istanziandoli e leggendo la loro proprietà Name
, ma ... ugh. Come posso correggere questo disegno in modo da non avere per fare questo?