Ich habe eine App mit fast derselben Datenarchitektur erstellt. Wir haben eine SQL-Datenbank vor Ort, die die meisten Automatisierungs- und internen Alltagsinformationen enthält, und dann einen Cloud-Service eines Drittanbieters, der für Vertrieb, Kontoverwaltung, Außendienstpersonal usw. verwendet wird. Der Helpdesk benötigte Informationen von beiden bezüglich der physischen Standorte der Kunden und Ausrüstung, und hatte es von zwei verschiedenen Anwendungen bekommen, bis ich eintrat.
Das lange und kurze ist, dass eine Datenquelle einen Verweis auf die Datensätze der anderen haben muss. In unserem Fall enthalten die Cloud-Daten von Drittanbietern Verweise auf die Daten vor Ort, da wir über diese Anordnung am meisten Kontrolle hatten. Mit einer ID für einen Datensatz aus einer der Datenquellen können wir jetzt Daten von beiden abrufen. Mit einer Cloud-ID ziehen wir den Datensatz aus der Cloud, rufen die Vor-Ort-ID ab und rufen die Vor-Ort-Daten ab. Mit einer Vor-Ort-ID fragen wir beide Datenquellen basierend auf dieser ID ab.
In meinem System habe ich keines der Objekte in der Domänenschicht zu einem untergeordneten Objekt des anderen gemacht. Bei jeder Verwendung der Daten aus beiden Speichern müssen zwei Objektinstanzen verwaltet werden. Keiner von beiden wird garantiert existieren, weshalb ich es so gemacht habe; Die App kann nur mit Cloud-Daten oder mit Vor-Ort-Daten oder beidem arbeiten. Je weniger Daten vorhanden sind, desto mehr Einschränkungen gelten.
Dies ist jedoch nicht schwer zu ändern, insbesondere wenn Sie sicher sind, dass immer eine Seite existieren wird. Fügen Sie einfach eine Eigenschaft in das Objekt ein, die die Seite darstellt, für die immer Daten vorhanden sind, dh vom Objekttyp, der den Datensatz des anderen Datenspeichers darstellt. Ein erweitertes "Zusammenführen" der beiden Diagramme zu einem ist möglich.
Diese Art der Anordnung muss notwendigerweise auf einer bestimmten Ebene gekoppelt sein. Sie können eine DAL haben, die mit beiden Datenspeichern verbunden werden kann, oder Sie können die DALs segmentieren, eine pro Datenspeicher, und eine höhere Schicht wie ein Controller kann die Daten von jedem abrufen und sie zusammenfassen. Auf einer bestimmten Ebene muss Ihr Programm jedoch über die nötigen Kenntnisse verfügen, um die Daten dieser beiden unterschiedlichen Datenquellen zusammenzufügen.
Sie können die in den meisten Fällen erforderliche Kopplung reduzieren, indem Sie Details darüber abstrahieren, woher die Daten stammen. Wenn Sie Daten von einem Webdienst erhalten, der Ihnen als Instanzen generierter Klassen zur Verfügung gestellt wird, setzen Sie einen Konverter ein, um eine tiefe Kopie der Dienstklasse in etwas zu erstellen, das Sie steuern, und das sich nicht ändern muss, wenn sich die Daten ändern Quelle tut (nur wenn das Schema tut).
Dies kann ein großes Unterfangen sein. Die von uns verwendete Cloud verfügt über Dutzende von Domänenklassen, von denen einige Hunderte von Datenfeldern aufweisen. Hier ist der Kicker: Möglicherweise müssen Sie sehr leicht große Änderungen am abstrakten Datentyp vornehmen, um einen Wechsel in eine andere Cloud oder eine andere Remote zu ermöglichen Datenquelle. Aus diesem Grund habe ich mich nicht darum gekümmert; Ich verwende die generierte Webdienstdomäne direkt und jetzt, da sich ein Wechsel von der Cloud zu einem externen (aber unter unserer Kontrolle stehenden) Datenspeicher abzeichnet, dessen Details ich noch nicht kenne, plane ich einfach, die Formulare und zu ändern Codebehinds der App, in der die Daten "kombiniert" werden, um das neue Schema und / oder die neuen Datenobjekte widerzuspiegeln. Es ist eine große Aufgabe, egal wie Sie es schneiden.