¿Cuál es la mejor práctica para utilizar para el repositorio cuando necesita hacer una recuperación costosa?

StackOverflow https://stackoverflow.com/questions/1631013

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í?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top