Я занимаюсь разработкой приложения на C #, которое представляет собой интерфейс, который может принимать или возвращать данные различным внешним приложениям / клиентам через (скорее всего) REST API.Приложение должно быть разработано достаточно гибко, чтобы внутреннее хранилище данных могло быть заменено только изменением файла конфигурации, чтобы указывать на новое хранилище данных или, возможно, циклически перебирать доступные хранилища данных, чтобы найти данные в хранилищах данных различного формата.Общая структура данных - это примерно файловая система / дерево с пользовательскими данными, прикрепленными к некоторым узлам для поиска, разрешений и т. Д.
Например, мы могли бы иметь живые производственные данные в SQLБД, но есть вероятность, что некоторые унаследованные данные будут храниться в плоских csv-файлах на сетевом ресурсе, и есть желание включить новые реализации интерфейса в будущем (их реализация в базе данных уже была бы определена,это означает, что если что-то имеет pkid типа GUID, мы не можем это изменить.)
Проблема, с которой я сталкиваюсь при планировании, заключается в том, что эти форматы внутренних данных имеют разные уникальные идентификаторы ... и т. д.Таким образом, интерфейс мог бы иметь метод:
public long CreateFolder(long parent, string folderName);
, который бы отлично работал для чего-то, использующего целочисленные или длинные идентификаторы, но у потребителя реализации интерфейса были бы проблемы, если бы возвращением действия CreateFolder было руководствоили имя файла (строка).Желание также состоит в том, чтобы как можно меньше изменить уровень «бизнес-логики» и внести изменения на уровне данных самого низкого уровня.
Моей первой мыслью было создать все интерфейсы, возвращающие строки, и позволить реализациям уровня данных иметь дело с приведением строк к собственному типу данных, но мне это кажется уродливым.
Есть какие-нибудь указания на что-то подобное?
РЕДАКТИРОВАТЬ: Чтобы добавить это шаблон, который я использую для интерфейсов БД.
https://softwareengineering.stackexchange.com/questions/301362/how-are-abstract-database-interfaces-written-to-support-multiple-database-types/301371
Сейчас я склоняюсь к перегрузке всех интерфейсов string, int и long, а затем обрабатываю приведение / преобразование в реализации интерфейса.