Actualmente estamos utilizando Entity Framework como ORM en algunas aplicaciones web, y hasta ahora, nos ha ido bien, ya que todos nuestros datos se almacenan en una sola base de datos. Estamos utilizando el patrón de repositorio, y tenemos servicios (la capa de dominio) que los utilizan, y devuelven las entidades EF directamente a los controladores ASP.NET MVC.
Sin embargo, ha surgido un requisito para utilizar una API de terceros (a través de un servicio web) que nos proporcionará información adicional relacionada con el usuario en nuestra base de datos. En nuestra base de datos de usuarios local, almacenaremos una identificación externa que podemos proporcionar a la API para obtener información adicional. Hay bastante información disponible, pero en aras de la simplicidad, una de ellas se refiere a la empresa del usuario (nombre, gerente, sala, cargo, ubicación, etc.). Esta información se usará en varios lugares a través de nuestras aplicaciones web, en lugar de usarse en un solo lugar.
Entonces mi pregunta es, ¿dónde está el mejor lugar para poblar y acceder a esta información? Como se usa en varios lugares, no es realmente sensato buscarlo ad-hoc donde sea que lo usemos en la aplicación web, por lo que tiene sentido devolver estos datos adicionales de la capa de dominio.
Mi pensamiento inicial fue crear una clase de modelo de contenedor que contendría la entidad EF (EFUser), y una nueva clase 'ApiUser' que contiene la nueva información, y cuando obtenemos un usuario, obtenemos el EFUser y luego obtenemos el adicional información de la API y rellene el objeto ApiUser. Sin embargo, si bien esto estaría bien para obtener usuarios individuales, se cae cuando se obtienen múltiples usuarios. No podemos alcanzar la API cuando obtenemos una lista de usuarios.
Mi segundo pensamiento fue simplemente agregar un método singleton a la entidad EFUser que devuelve el ApiUser, y completarlo cuando sea necesario. Esto resuelve el problema anterior ya que solo accedemos a él cuando lo necesitamos.
O el pensamiento final fue mantener una copia local de los datos en nuestra base de datos y sincronizarla con la API cuando el usuario inicia sesión. Esto es un trabajo mínimo, ya que es solo un proceso de sincronización, y no tenemos la carga de golpear. la base de datos y la API cada vez que queremos obtener información del usuario. Sin embargo, esto significa almacenar los datos en dos lugares, y también significa que los datos están desactualizados para cualquier usuario que no haya iniciado sesión por un tiempo.
¿Alguien tiene algún consejo o sugerencia sobre la mejor manera de manejar este tipo de escenario?
it's not really sensible to fetch it on an ad-hoc basis
-- ¿Por qué? Por razones de rendimiento?