2010-10-07 22 views
35

En la clase ahora estamos aprendiendo cómo crear una aplicación Spring, aunque la primavera no está directamente involucrada, aprendimos cómo hacer las interfaces para DAO y los objetos de capa de servicio.Capa de servicio y controlador: ¿quién se encarga de qué?

Por favor, corríjanme si me equivoco: capa DAO es bastante abstracto: sólo contiene las operaciones CRUD y se utiliza más para leer los datos. (Es decir: conseguir todos los objetos, obtener objetos específicos, etc.)

Capa de servicio: contiene servicios para crear cosas y eliminar cosas, aquí es donde debería estar la lógica de negocios.

Ahora todo esto tiene sentido en la capa de servicio; excepto objetos de "actualización". ¿Acabas de poner una función de "actualización" que simplemente guarda el objeto en tu base de datos? ¿O es necesario definir la lógica allí también? Aquí es donde está mi confusión, mi comprensión es que los objetos en primavera son solo POJO. Ahora, ¿quién valida los datos?

Digamos que tengo un "niño" Objeto tiene: Name, SurName, Gender, Photo, Birthdate campos. ¿cómo nombraría los servicios? ¿O dejarías que el controlador se encargue de la validación, lo cual no me parece correcto? Por otro lado, no parece correcto delegar cada setter que necesita ser llamado a la capa de servicio.

Así que básicamente: ayúdeme a definir cómo guardar sus objetos a través de la capa de servicio.

Respuesta

22

Si usted desea tener controladores sean capaces de persistir los cambios en un objeto Child, a continuación, tradicionalmente tendría un método en el servicio llamado algo así como ChildService.update(Child newchild), que se encargará de llamar a los DAOs correctas para persistir la nueva versión de este niño .

Los controladores son libres de solicitar el servicio de un niño, cambiar los campos (posiblemente basándose en la información del usuario): un diseño sensato haría que el controlador trabaje con el POJO infantil y luego solicite al servicio que cambio. El modelo POJO no debe saber nada acerca de un controlador, servicio o DAO, sino simplemente mantener los datos como usted sugiere; sin duda, no le conviene que todas las llamadas a setName() o setGender() den como resultado automáticamente una actualización de la base de datos.

En su lugar, el controlador y/o servicio debe adquirir un objeto Child, hacer el trabajo necesario para el objeto en su unidad de trabajo y luego solicitar un Servicio (y luego el DAO) para conservar los cambios.

La validación puede tener lugar en varias capas: el controlador puede querer validar cualquier entrada del usuario web, y el servicio puede querer validar que tiene un objeto Child válido antes de que lo conserve. Tiene especial sentido tener algún nivel de validación en ambas capas en caso de que desee reutilizar este Servicio en otras capacidades, como exponer una interfaz REST, un front-end diferente, etc.

35

Generalmente un servicio de Spring es transaccional Las cosas entran en un método de servicio particular porque deben agruparse en la misma transacción. Si desea recuperar un objeto de la base de datos, mezclarlo y guardar la nueva versión, la recuperación y el guardado deben estar en el mismo método de servicio. Entonces, sus métodos de servicio se determinan de acuerdo con lo que necesita que la aplicación haga por el usuario.

Intento restringir los controladores a realizar tareas relacionadas con la validación de parámetros http, decidir qué método de servicio llamar con qué parámetros, qué poner en la httpsession o solicitud, qué vista redirigir o reenviar, o similar relacionado con la web cosas.

En lo que se refiere a la validación: Validar los parámetros de entrada en el controlador es una buena cosa para asegurarse de que nadie pueda romper su aplicación con entradas falsas. La validación en el controlador tiende a asegurar que las entradas estén sintácticamente bien (incluida la detección de ataques de inyección), mientras que la validación a nivel de servicio se trata de asegurarse de que el estado de las cosas en la base de datos sea el esperado.

Por lo que los controladores contienen código de infraestructura web-framework, los servicios contienen código de lógica de aplicación.

+3

simplemente para agregar a esto: es una buena idea que los "servicios" en general (no solo cuando se usa Spring, pero quizás también al exponer servicios remotos o algún tipo de API) tengan métodos que sean candidatos naturales para las transacciones –

Cuestiones relacionadas