Atualmente, estamos usando o Entity Framework como um ORM em alguns aplicativos da Web e, até agora, ele nos serviu bem, pois todos os nossos dados são armazenados em um único banco de dados. Estamos usando o padrão de repositório e temos serviços (a camada de domínio) que os utilizam e retornam as entidades EF diretamente aos controladores do ASP.NET MVC.
No entanto, surgiu um requisito para utilizar uma API de terceiros (por meio de um serviço da Web) que nos fornecerá informações extras relacionadas ao usuário em nosso banco de dados. Em nosso banco de dados local de Usuários, armazenaremos um ID externo que podemos fornecer à API para obter informações adicionais. Há bastante informação disponível, mas por uma questão de simplicidade, uma delas se refere à empresa do usuário (nome, gerente, sala, cargo, local etc.). Essas informações serão usadas em vários locais em nossos aplicativos da web - em vez de serem usadas em um único local.
Então, minha pergunta é: qual é o melhor lugar para preencher e acessar essas informações? Como é usado em vários lugares, não é realmente sensato buscá-lo ad-hoc onde quer que o aplicativo seja usado - portanto, faz sentido retornar esses dados adicionais da camada de domínio.
Meu pensamento inicial era apenas criar uma classe de modelo de wrapper que contivesse a entidade EF (EFUser) e uma nova classe 'ApiUser' contendo as novas informações - e quando obtemos um usuário, obtemos o EFUser e, em seguida, obtemos o adicional informações da API e preencha o objeto ApiUser. No entanto, embora isso seja bom para obter usuários únicos, ele cai ao receber vários usuários. Não podemos acessar a API ao obter uma lista de usuários.
Meu segundo pensamento foi apenas adicionar um método singleton à entidade EFUser que retorna o ApiUser e preenchê-lo quando necessário. Isso resolve o problema acima, pois só o acessamos quando precisamos.
Ou o pensamento final era manter uma cópia local dos dados em nosso banco de dados e sincronizá-la com a API quando o usuário efetuar login. Isso é um trabalho mínimo, pois é apenas um processo de sincronização - e não temos a sobrecarga de acessar o banco de dados e a API sempre que queremos obter informações do usuário. No entanto, isso significa armazenar os dados em dois locais e também significa que os dados estão desatualizados para qualquer usuário que não esteja conectado há um tempo.
Alguém tem algum conselho ou sugestão sobre a melhor forma de lidar com esse tipo de cenário?
it's not really sensible to fetch it on an ad-hoc basis
-- Por quê? Por razões de desempenho?