Prima di tutto, tieni presente che fare qualcosa di simile entity.underlyingEntity.underlyingEntity.method()
è considerato un odore di codice secondo la Legge di Demetra . In questo modo, stai esponendo al consumatore molti dettagli di implementazione. E ogni necessità di estensione o modifica di un tale sistema farà molto male.
Quindi, ti consiglio di avere un metodo HasRole
o IsAdmin
sul User
commento di CodesInChaos. In questo modo, il modo in cui i ruoli vengono implementati sull'utente rimane un dettaglio di implementazione per il consumatore. Inoltre, è più naturale chiedere all'utente quale sia il suo ruolo invece di chiedergli i dettagli del suo ruolo e decidere in base a quello.
Si prega inoltre di evitare di usare string
s se non necessario. name
è un buon esempio di string
variabile perché i contenuti sono sconosciuti in precedenza. D'altra parte, qualcosa come role
dove hai due valori distinti che sono ben noti al momento della compilazione, è meglio usare la tipizzazione forte. È qui che entra in gioco il tipo di enumerazione ...
Confrontare
public bool HasRole(string role)
con
public enum Role { Admin, User }
public bool HasRole(Role role)
Il secondo caso mi dà molte più idee su cosa dovrei passare. Inoltre mi impedisce di passare erroneamente un invalido string
nel caso in cui non avessi idea delle costanti del tuo ruolo.
La prossima è la decisione su come sarà il ruolo. Puoi usare enum direttamente memorizzato sull'utente:
public enum Role
{
Admin,
User
}
public class User
{
private Role _role;
public bool HasRole(Role role)
{
return _role == role;
}
// or
public bool IsAdmin()
{
return _role == Role.Admin;
}
}
D'altra parte, se vuoi che il tuo ruolo abbia un comportamento stesso, dovrebbe sicuramente nascondere di nuovo i dettagli di come viene deciso il suo tipo:
public enum RoleType
{
User,
Admin
}
public class Role
{
private RoleType _roleType;
public bool IsAdmin()
{
return _roleType == RoleType.Admin;
}
public bool IsUser()
{
return _roleType == RoleType.User;
}
// more role-specific logic...
}
public class User
{
private Role _role;
public bool IsAdmin()
{
return _role.IsAdmin();
}
public bool IsUser()
{
return _role.IsUser();
}
}
Questo è comunque abbastanza dettagliato e la complessità aumenterebbe con ogni aggiunta di ruolo - di solito è così che il codice finisce quando si tenta di aderire pienamente alla Legge di Demetra. È necessario migliorare la progettazione, in base ai requisiti concreti del sistema da modellare.
Secondo la tua domanda, immagino che farai meglio con la prima opzione con enum direttamente su User
. Se hai bisogno di più logica su Role
, la seconda opzione dovrebbe essere considerata come un punto di partenza.
User.HasRole(Role.Admin)
.