En una aplicación común diseñada por MVC, ¿es una mala idea hacer que la capa de servicio dependa de una sesión de usuario? Supongamos que hay un método de servicio que obtiene algunos objetos de una base de datos y desea devolver resultados diferentes según quién inicialice la llamada; por ejemplo, un administrador puede obtener 10 filas de objetos, mientras que un usuario normal solo puede obtener 7 filas porque los últimos 3 fueron objetos "solo para el administrador". Algunas maneras de resolver esto serían:¿Tiene mal diseño hacer que su capa de negocios (servicio) dependa de una sesión de usuario?
- Introduzca un nuevo parámetro de método donde incluya al usuario que llama. Dependencia, pero incómodo tener que agregar parámetros de usuario en muchos métodos.
- Realice diferentes métodos para diferentes roles de usuario (con resultados múltiples). También sin dependencias pero con muchos métodos que básicamente hacen lo mismo, lo que aumenta el riesgo de duplicación de código.
- Deja que el método lea desde una variable ThreadLocal en un contexto estático que almacena la sesión de usuario actual. Esta variable se establece antes de cada solicitud.
Últimamente, he comenzado a utilizar el último método cada vez más, ya que proporciona una interfaz limpia y se siente muy práctico para trabajar. Un filtro se asegura de que el hilo actual siempre tenga un conjunto de usuarios. ¿Es este mal diseño? Creo que algunos podrían ver esto como una dependencia de la capa de servicio a la capa web, aunque personalmente creo que están bastante desacoplados. La mayor consecuencia es que el comportamiento de los métodos será diferente dependiendo del estado de otra clase, lo que podría ser malo y bueno.
¿Qué piensas de esto? Si es una mala solución, ¿cuál sería más fuerte?
Puntos muy válidos, relacionados con cosas que me preocupaban. –
> parecería natural pasar al usuario como un parámetro. ¿¿¿Por qué??? EJB ya le proporcionó acceso a los roles del usuario y a la declaración del problema que es todo lo que necesita OP. –
@dexter - seguro de que tendría sentido si está utilizando EJB para roles de usuario/seguridad - la pregunta no especifica esto sin embargo. – mikera