J'ai créé une application avec à peu près la même architecture de données; nous avons une base de données SQL sur site contenant la plupart des informations quotidiennes d'automatisation et internes, puis un service cloud tiers utilisé pour les ventes, la gestion des comptes, le personnel sur le terrain, etc. et de l'équipement, et je l'avais obtenu de deux applications différentes jusqu'à ce que j'intervienne.
Le long et le court est qu'une source de données doit avoir une référence aux enregistrements de l'autre. Dans notre cas, les données cloud tierces contiennent des références aux données sur site car c'est l'arrangement sur lequel nous avions le plus de contrôle. Maintenant, avec un ID pour un enregistrement de l'une ou l'autre source de données, nous pouvons obtenir des données des deux; avec un identifiant cloud, nous extrayons l'enregistrement du cloud, obtenons l'ID sur site et récupérons les données sur site. Avec un ID sur site, nous interrogeons les deux sources de données en fonction de cet ID.
Dans mon système, je n'ai pas fait de l'un des objets un enfant de l'autre dans la couche domaine; toute utilisation des données des deux magasins doit conserver deux instances d'objet. Aucun des deux n'est garanti d'exister, c'est pourquoi je l'ai fait de cette façon; l'application ne peut fonctionner qu'avec des données cloud, ou avec des données sur site, ou les deux, avec plus de limitations, moins elle dispose de données.
Cependant, ce n'est pas difficile à changer, surtout si vous êtes sûr qu'un côté existera toujours; il suffit d'inclure une propriété dans l'objet représentant le côté pour lequel les données existeront toujours, c'est-à-dire du type d'objet représentant l'enregistrement de l'autre magasin de données. Une "fusion" plus avancée des deux graphiques en un seul est possible.
Ce type d'arrangement doit nécessairement être couplé à un certain niveau. Vous pouvez avoir un DAL qui peut s'interfacer avec les deux magasins de données, ou vous pouvez segmenter les DAL, un par magasin de données, et avoir une couche supérieure telle qu'un contrôleur obtenir les données de chacun et les attacher ensemble. Mais, à un certain niveau, votre programme doit avoir l'intelligence de rassembler les données de ces deux sources de données disparates.
Vous pouvez réduire le couplage requis dans la plupart des cas en faisant abstraction des détails sur la provenance exacte des données. Si vous obtenez des données d'un service Web, qui vous sont fournies en tant qu'instances de classes générées, mettez un convertisseur en place pour créer une copie complète de la classe de service dans quelque chose que vous contrôlez, qui n'aura pas à changer si les données la source le fait (uniquement si le schéma le fait).
Maintenant, cela peut être une entreprise énorme; le cloud que nous utilisons a des dizaines de classes de domaine, dont certaines ont des centaines de champs de données, et - voici le kicker - vous pourriez très facilement devoir apporter de grandes modifications au type de données abstrait pour s'adapter à un déplacement vers un autre cloud ou une autre télécommande la source de données. Pour cette raison, je n'ai pas pris la peine; J'utilise directement le domaine de service Web généré, et maintenant qu'un changement du cloud vers un magasin de données hors site (mais sous notre contrôle) se profile, dont je ne sais toujours pas les détails, je prévois simplement de changer les formulaires et codebehinds de l'application, qui est l'endroit où les données sont «combinées», pour refléter le nouveau schéma et / ou les objets de données. C'est un gros travail, quelle que soit la façon dont vous le découpez.