Stworzyłem aplikację z tą samą architekturą danych; mamy lokalną bazę danych SQL zawierającą większość automatyzacji i wewnętrznych informacji z dnia na dzień, a następnie zewnętrzną usługę w chmurze używaną do sprzedaży, zarządzania kontem, personelu terenowego itp. Dział pomocy potrzebował informacji od obu dotyczących fizycznych lokalizacji klientów i sprzęt. Dostawałem go z dwóch różnych aplikacji, dopóki nie wkroczyłem.
Długie i krótkie jest to, że jedno źródło danych musi mieć odniesienie do zapisów drugiego. W naszym przypadku dane w chmurze stron trzecich zawierają odniesienia do danych na miejscu, ponieważ to układ, nad którym mieliśmy największą kontrolę. Teraz, mając identyfikator rekordu z dowolnego źródła danych, możemy uzyskać dane z obu; za pomocą identyfikatora w chmurze pobieramy rekord z chmury, uzyskujemy identyfikator u klienta i pobieramy dane u klienta. Za pomocą identyfikatora na miejscu sondujemy oba źródła danych na podstawie tego identyfikatora.
W moim systemie nie uczyniłem żadnego obiektu dzieckiem drugiego w warstwie domeny; każde użycie danych z obu sklepów musi utrzymywać dwie instancje obiektów. Żaden z nich nie istnieje, dlatego tak zrobiłem; aplikacja może działać tylko z danymi w chmurze, z danymi lokalnymi lub z obydwoma tymi elementami, im więcej ograniczeń, tym mniej danych ma.
Nie jest to jednak trudne do zmiany, zwłaszcza jeśli masz pewność, że jedna strona zawsze będzie istnieć; po prostu dołącz właściwość do obiektu reprezentującego stronę, dla której zawsze będą istnieć dane, to znaczy typu obiektu reprezentującego rekord innego magazynu danych. Możliwe jest bardziej zaawansowane „łączenie” dwóch wykresów w jeden.
Tego rodzaju układ musi koniecznie być sprzężony na pewnym poziomie. Możesz mieć DAL, który może łączyć się z oboma magazynami danych, lub możesz segmentować DAL, jeden na magazyn danych, i mieć wyższą warstwę, taką jak kontroler, który pobiera dane z każdego z nich i przyciąga je do siebie. Ale, na pewnym poziomie, twój program musi mieć spryt, by połączyć te dwa różne źródła danych.
W większości przypadków można zmniejszyć wymagane sprzężenie, wyodrębniając szczegóły dokładnie, skąd pochodzą dane. Jeśli otrzymujesz dane z usługi internetowej, która jest przekazywana jako instancje wygenerowanych klas, to umieść konwerter, aby utworzyć głęboką kopię klasy usługi w coś, co kontrolujesz, co nie będzie musiało się zmienić, jeśli dane robi to źródło (tylko jeśli schemat).
To może być ogromne przedsięwzięcie; chmura, której używamy, ma dziesiątki klas domen, z których niektóre mają setki pól danych, i - oto jest kicker - możesz bardzo łatwo wprowadzić duże zmiany w abstrakcyjnym typie danych, aby umożliwić przejście do innej chmury lub innego zdalnego źródło danych. Z tego powodu nie zawracałem sobie głowy; Korzystam bezpośrednio z wygenerowanej domeny usług internetowych, a teraz, gdy zbliża się zmiana z chmury na zewnętrzny (ale pod naszą kontrolą) magazyn danych, którego szczegółów wciąż nie znam, po prostu planuję zmienić formularze i kody aplikacji, w których dane są „łączone”, aby odzwierciedlić nowy schemat i / lub obiekty danych. To wielka praca, bez względu na to, jak ją pokroisz.