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?