Capas de Servicio y Repositorios


He estado usando frameworks MVC por un corto tiempo y realmente me gusta cómo se separan las preocupaciones. Tengo el mal hábito de dejar que los controladores hagan un poco de trabajo. Así que realmente estoy buscando algún consejo.

Cuando empecé a usar MVC a menudo tenía el controlador haciendo la manipulación de los modelos después de que el trabajo de la base de datos se había hecho. Sabía que esto era malo, así que trasladé ese trabajo a las modelos. Sin embargo, no estoy contento con eso, ya que quiero que mis modelos sean muy aprender.

He hecho un poco de lectura y veo que la gente está manteniendo sus controladores y modelos magros por tener una capa de servicio, que me gusta el aspecto de.

Solo estoy tratando de entender cómo una capa de servicio y un repositorio deben trabajar juntos. Aquí están mis suposiciones, ¿puede por favor hacerme saber si esta es una buena manera de trabajar?

  1. El controlador puede llamar al repositorio directamente si no es necesario realizar ninguna manipulación de los datos y, como tal, una capa de servicio no necesita involucrarse
  2. Una vez que cualquier trabajo debe hacerse a los datos (lógica de negocio) entonces esto debe hacerse en la capa de servicio y el controlador hará una simple llamada a la capa de servicio como y cuando sea necesario
  3. Una vez que un servicio ha hecho su lógica de negocio, utilizará el repositorio según sea necesario (si los datos deben persistir).
  4. Los modelos idealmente deben mantenerse magros, idealmente actings como nada más que DTOs
  5. Se realizará la validación de los datos dentro de los modelos (usando atributos de validación de monorriel). Aprecio que ni siquiera a uno le guste contaminar sus modelos con muchos atributos, pero esa es una discusión diferente. Me gusta el beneficio de los atributos de validación de MonoRail para la validación automática de jQuery en la interfaz de usuario.

Estoy tratando de convertir todo mi código en el principio de responsabilidad única, por lo tanto, tratando de ordenar mis prácticas de codificación.

Gracias

Author: Martijn Pieters, 2008-11-28

3 answers

Primero, no hay un conjunto de reglas que funcionen en cada situación. La forma en que modele su aplicación depende mucho del tipo y la complejidad del proyecto. Dicho esto, he aquí algunas ideas:

  1. No hay nada malo en llamar al repositorio desde un controlador. Solo asegúrese de que el controlador no contenga lógica de negocio.
  2. El servicio se encarga de (alguna) lógica de negocio y utiliza otros servicios para hacerlo. El repositorio es un tipo de servicio, no hay nada está mal llamarla desde un servicio.
  3. El modelo debe contener lógica de negocios, en realidad siempre debe tratar de ponerlo en el modelo primero. Si necesita datos externos para realizar esa lógica de negocio (desde otro modelo o desde el repositorio), debe crear un servicio.
  4. No hay nada malo con la validación en los modelos. Usar atributos o no es una cuestión de gusto (si te gusta, entonces es bueno). Mover la validación fuera del modelo si se vuelve demasiado compleja (crear un conjunto externo de reglas).

Lo más importante es hacer lo que se siente bien (esa suele ser la respuesta correcta).

 25
Author: gcores,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-28 15:53:21

Este video da una gran idea de cómo organizar su asp.net MVC solución y abordar la separación de preocupaciones, y una mejor capacidad de prueba. Esperemos que ayude a alguien más también. Aprendí algunas cosas buenas de él.

 6
Author: Mandeep Janjua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 21:31:14

Ian Cooper acaba de escribir una entrada de blog llamada The Fat Controller sobre este tema.

 5
Author: BigJump,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-04 14:57:45