En primer lugar, tenga en cuenta que hacer algo como entity.underlyingEntity.underlyingEntity.method()se considera un olor a código según la Ley de Demeter . De esta manera, está exponiendo muchos detalles de implementación al consumidor. Y cada necesidad de extensión o modificación de dicho sistema dolerá mucho.
Entonces, dado eso, te recomiendo que tengas un método HasRoleo IsAdminmétodo según el Usercomentario de CodesInChaos. De esta forma, la forma en que se implementan los roles en el usuario sigue siendo un detalle de implementación para el consumidor. Y también se siente más natural preguntarle al usuario cuál es su rol en lugar de preguntarle sobre los detalles de su rol y luego decidir basándose en eso.
También evite usar strings a menos que sea necesario. namees un buen ejemplo de stringvariable porque los contenidos son desconocidos de antemano. Por otro lado, algo así como roledonde tiene dos valores distintos que son bien conocidos en el momento de la compilación, será mejor que use una escritura fuerte. Ahí es donde entra en juego el tipo de enumeración ...
Comparar
public bool HasRole(string role)
con
public enum Role { Admin, User }
public bool HasRole(Role role)
El segundo caso me da mucha más idea de lo que debería estar pasando. También me impide pasar erróneamente un inválido stringen caso de que no tuviera idea de las constantes de su rol.
Lo siguiente es la decisión sobre cómo se verá el papel. Puede usar enum directamente almacenado en el usuario:
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;
}
}
Por otro lado, si desea que su rol tenga un comportamiento en sí mismo, definitivamente debería ocultar nuevamente los detalles de cómo se decide su 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();
}
}
Sin embargo, esto es bastante detallado y la complejidad aumentaría con cada adición de roles; por lo general, así es como termina el código cuando intenta adherirse completamente a la Ley de Demeter. Debe mejorar el diseño, en función de los requisitos concretos del sistema que se está modelando.
Según su pregunta, supongo que será mejor que elija la primera opción con enum directamente User. Si necesita más lógica sobre el Role, la segunda opción debe considerarse como un punto de partida.
User.HasRole(Role.Admin).