Я создал приложение с почти такой же архитектурой данных; у нас есть локальная база данных SQL, содержащая большую часть автоматизированной и внутренней оперативной информации, а затем стороннюю облачную службу, используемую для продаж, управления учетными записями, полевого персонала и т. д. Служба поддержки нуждалась в информации как физических лиц, так и клиентов. и оборудование, и получал его из двух разных приложений, пока я не вмешался.
Длинным и коротким является то, что один источник данных должен иметь ссылку на записи другого. В нашем случае сторонние облачные данные содержат ссылки на локальные данные, потому что это механизм, который мы контролировали больше всего. Теперь, с помощью идентификатора для записи из любого источника данных, мы можем получить данные из обоих; с помощью идентификатора облака мы извлекаем запись из облака, получаем идентификатор на месте и извлекаем данные на месте. Используя локальный идентификатор, мы опрашиваем оба источника данных на основе этого идентификатора.
В моей системе я не делал ни одного объекта дочерним по отношению к другому на уровне домена; любое использование данных из обоих хранилищ должно поддерживать два экземпляра объекта. Ни один из них не гарантированно существует, поэтому я так и сделал; приложение может работать только с облачными данными, с локальными данными или с обоими, с большими ограничениями, чем меньше данных.
Однако это не сложно изменить, особенно если вы уверены, что одна сторона будет существовать всегда; просто включите в объект свойство, представляющее сторону, для которой всегда будут существовать данные, то есть тип объекта, представляющий запись другого хранилища данных. Возможно более сложное «объединение» двух графиков в один.
Такая договоренность обязательно должна быть связана на каком-то уровне. У вас может быть DAL, который может взаимодействовать с обоими хранилищами данных, или вы можете сегментировать DAL, по одному на хранилище данных, и иметь более высокий уровень, такой как Контроллер, который получает данные из каждого и связывает их вместе. Но на каком-то уровне ваша программа должна обладать умом объединять данные этих двух разнородных источников данных.
Вы можете уменьшить требуемую связь в большинстве случаев, абстрагировавшись от подробностей, откуда именно поступают данные. Если вы получаете данные из веб-службы, которая предоставляется вам в качестве экземпляров сгенерированных классов, то установите конвертер для создания глубокой копии класса службы в то, что вы контролируете, которое не нужно будет менять, если данные источник делает (только если схема делает).
Теперь это может быть огромным предприятием; Облако, которое мы используем, имеет десятки классов доменов, некоторые из которых имеют сотни полей данных, и - вот что примечательно - вам может быть очень легко внести большие изменения в абстрактный тип данных, чтобы приспособиться к переходу в другое облако или другое удаленное источник данных. По этой причине я не беспокоился; Я использую сгенерированный домен веб-службы напрямую, и теперь, когда переход от облака к внешнему (но под нашим контролем) хранилищу данных вырисовывается, подробности которого я до сих пор не знаю, я просто планирую изменить формы и кодовые привязки приложения, в котором данные «объединяются», чтобы отразить новую схему и / или объекты данных. Это большая работа, независимо от того, как ты ее нарезаешь.