¿Es una mala práctica que el controlador llame al repositorio en lugar del servicio?
para explicar más:
Me doy cuenta de que en un buen diseño los controladores llaman al servicio y al repositorio de uso del servicio.
pero a veces en el controlador no tengo / necesito ninguna lógica y solo necesito obtener de db y pasarlo para ver.
y puedo hacerlo simplemente llamando al repositorio, no es necesario llamar al servicio, ¿es una mala práctica?
design-patterns
object-oriented
mvc
repository
mohsenJsh
fuente
fuente
Respuestas:
No, piénselo de esta manera: un repositorio es un servicio (también).
Si las entidades que recupera a través del repositorio manejan la mayor parte de la lógica de negocios, no hay necesidad de otros servicios. Solo tener el repositorio es suficiente.
Incluso si tiene algunos servicios que debe pasar para manipular sus entidades. Primero tome la entidad del repositorio y luego páselo a dicho servicio. Poder lanzar un HTTP 404 antes de intentarlo es muy conveniente.
También para los escenarios de lectura es común, solo necesita la entidad para proyectarlo en un DTO / ViewModel. Tener una capa de servicio intermedia a menudo resulta en una gran cantidad de métodos de transferencia que son bastante feos.
fuente
No es una mala práctica que un controlador llame a un repositorio directamente. Un "servicio" es solo otra herramienta, así que úselo donde tenga sentido.
NikolaiDante comentó:
No creo que la consistencia sea el aspecto más importante. Una clase de "servicio" está destinada a encapsular alguna lógica de nivel superior para que el controlador no necesite implementarla. Si no se requiere una "lógica de nivel superior" para una operación determinada, simplemente vaya directamente al repositorio.
Para promover una buena Separación de preocupaciones y capacidad de prueba, el repositorio debe ser una dependencia que inyecte en el servicio a través de un constructor:
Si la búsqueda de registros en la base de datos necesita algún tipo de consulta parametrizada, una clase de servicio podría ser un buen lugar para tomar en su modelo de vista y construir una consulta que luego se ejecuta por el repositorio.
Del mismo modo, si tiene un modelo de vista complejo para un formulario, una clase de servicio puede encapsular la lógica de crear, actualizar y eliminar registros llamando a métodos en sus Modelos / Entidades de Dominio, y luego persistiéndolos usando un repositorio.
Yendo en la dirección opuesta, si su controlador necesita obtener un registro por su Id, delegar en un objeto de servicio para esto es como golpear una chincheta con un mazo: es mucho más de lo que necesita.
He descubierto que el controlador está en la mejor posición para manejar la transacción, o un objeto de Unidad de trabajo . El controlador o el objeto Unidad de trabajo luego delegaría en objetos de servicio para operaciones complejas, o iría directamente al repositorio para operaciones simples (como encontrar un registro por Id).
Creo que una combinación de servicios y trabajar con repositorios directamente es perfectamente aceptable. Puede encapsular aún más la transacción en un objeto de Unidad de trabajo si siente la necesidad.
El desglose de responsabilidades es el siguiente:
fuente
DbContext
es un mal nombre en este caso. Voy a cambiar eso Uso NHibernate, y los repositorios (o contexto si es útil) administran el final de la base de datos, por lo que cambiar los mecanismos de persistencia no requiere cambios de código fuera del contexto.Depende de tu arquitectura. Yo uso Spring, y la transaccionalidad siempre es administrada por los servicios.
Si llama a los repositorios directamente para operaciones de escritura (o servicios simples sin lógica que simplemente delegan en el repositorio), probablemente esté utilizando varias transacciones de base de datos para una operación que debe realizarse en una. Eso conducirá a datos incoherentes en su base de datos. Como regla general, las operaciones de la base de datos deberían funcionar, o deberían fallar, pero las operaciones de medio trabajo son la causa de dolores de cabeza.
Por esa razón, creo que llamar a los repositorios directamente desde los controladores, o usar servicios de delegación simples, es una mala práctica. Empiezas a hacerlo solo para leer, y muy pronto tú, o uno o tus compañeros, comenzarán a hacerlo para operaciones de escritura.
fuente