¿Cuál es la mejor práctica para utilizar para el repositorio cuando necesita hacer una recuperación costosa?
-
06-07-2019 - |
Pregunta
Ok, digamos que tengo una clase DataRepository con los métodos, getNames () y getStates (). supongamos que estos datos se almacenan en un servicio web o una base de datos que es una operación costosa.
una vez que se ejecuta y devuelve la primera consulta, cuando un consumidor solicita estos métodos, se devuelve de inmediato ya que los resultados se almacenan en caché en la clase DataRepository.
el problema es que, para la primera llamada, es conveniente que el comportamiento sea asíncrono para evitar el bloqueo de esta costosa llamada. ¿Cuál es la mejor manera de codificar esto? Es el hecho de que esta clase DataRepository está haciendo tanto la recuperación cruzada real como el rompimiento del almacenamiento en caché Principio de responsabilidad única.
¿alguna otra idea sobre las mejores prácticas aquí?
Solución
para la primera llamada que desea comportamiento para ser asíncrono para evitar el bloqueo en esta costosa llamada. Cuál es el mejor forma de codificar esto?
Esa es la preocupación de quien llama. Es mejor proporcionar interfaces sincrónicas y asincrónicas para que los clientes puedan decidir cuál es la adecuada para su situación.
Es el hecho de que este DataRepository la clase está haciendo tanto cruz real recuperación y almacenamiento en caché rompiendo la responsabilidad individual Principio.
Sí, rompe el SRP si la clase del repositorio está involucrada en la implementación de recuperación y almacenamiento en caché. Además, la decisión sobre qué fuente utilizar generalmente requiere una lógica significativa, que es otra buena razón para separar estas funciones en diferentes clases. (Con la advertencia estándar: si YAGNI , ¡entonces no lo hagas!)
Otros consejos
¿Es realmente responsabilidad del repositorio saber si se llama asíncrono o no? Pensaría que solo haría su llamada y devolvería sus datos, no se trata de cómo se llama. Tampoco creo que sea su responsabilidad almacenar los datos ... si desea almacenar los datos, la persona que llama (algún intermediario posiblemente) puede almacenarlos. El repositorio debe ser bastante simple ... solicitar datos y devolver datos. O incluso devuelva IQueryable y deje que la pieza que necesita los datos realmente obtenga los datos ...
Si tiene que hacer la primera llamada asíncrona, también puede hacer todas las llamadas asíncronas. Esto hará que su código sea más fácil de escribir y comprender. No tendrá que lidiar con 2 patrones de llamadas diferentes.
El repositorio de datos debe ser responsable de una cosa: llevar los datos al usuario. Recupera los datos de un almacén de datos. Ese almacén de datos podría ser la costosa llamada a WS o DB o la llamada barata desde el caché. El repositorio de datos puede verificar la existencia de los datos en el caché y devolverlos u obtener los datos de WS o DB, ponerlos en el caché y luego devolverlos.