Criei um aplicativo com a mesma arquitetura de dados por trás dele; temos um banco de dados SQL no local que contém a maioria das informações internas do dia-a-dia da automação e, em seguida, um serviço de nuvem de terceiros usado para vendas, gerenciamento de contas, equipe de campo, etc. e equipamento, e o obtive de duas aplicações diferentes até eu entrar.
O longo e o curto é que uma fonte de dados precisa ter uma referência aos registros da outra. No nosso caso, os dados na nuvem de terceiros contêm referências aos dados no local, porque esse é o arranjo sobre o qual tivemos mais controle. Agora, com um ID para um registro de qualquer uma das fontes de dados, podemos obter dados de ambas; com um ID da nuvem, extraímos o registro da nuvem, obtemos o ID no local e extraímos os dados no local. Com um ID no local, pesquisamos as duas fontes de dados com base nesse ID.
No meu sistema, não tornei nenhum objeto filho do outro na camada de domínio; qualquer uso dos dados de ambos os armazenamentos deve manter duas instâncias de objeto. Nenhum deles é garantido que existe, e é por isso que eu fiz dessa maneira; o aplicativo pode funcionar apenas com dados em nuvem, ou com dados no local, ou ambos, com mais limitações quanto menos dados tiver.
No entanto, isso não é difícil de mudar, especialmente se você tiver certeza de que um lado sempre existirá; basta incluir uma propriedade no objeto que representa o lado para o qual os dados sempre existirão, ou seja, do tipo de objeto que representa o registro do outro repositório de dados. É possível uma "fusão" mais avançada dos dois gráficos em um.
Esse tipo de arranjo deve necessariamente ser associado em algum nível. Você pode ter um DAL que possa interagir com os dois armazenamentos de dados ou segmentar os DALs, um por armazenamento de dados, e ter uma camada superior, como um Controlador, obter os dados de cada um e juntá-los. Mas, em algum nível, seu programa precisa ter inteligência para reunir os dados dessas duas fontes de dados diferentes.
Você pode reduzir o acoplamento necessário na maioria dos casos, abstraindo os detalhes exatamente de onde os dados vêm. Se você obtiver dados de um serviço da Web, que é fornecido como instâncias de classes geradas, coloque um conversor para fazer uma cópia profunda da classe de serviço em algo que você controla, que não precisará ser alterado se os dados origem sim (apenas se o esquema sim).
Agora, isso pode ser um grande empreendimento; a nuvem que usamos possui dezenas de classes de domínio, algumas das quais com centenas de campos de dados e - aqui está o kicker - você pode facilmente fazer grandes alterações no tipo de dados abstratos para acomodar uma mudança para uma nuvem diferente ou outro controle remoto fonte de dados. Por esse motivo, eu não me incomodei; Uso o domínio de serviço da web gerado diretamente e agora que uma mudança da nuvem para um armazenamento de dados externo (mas sob nosso controle) está se aproximando, cujos detalhes ainda não sei, estou simplesmente planejando alterar os formulários e codebehinds do aplicativo, que é onde os dados são "combinados", para refletir o novo esquema e / ou objetos de dados. É um grande trabalho, seja qual for o modo como você o corta.