Я пишу приложение, которое используется для каталогизации файлов и приписывает эти файлы метаданным.Программа для создания фотоальбомов будет хорошим сравнением с тем, что я пытаюсь сделать.
Я пытаюсь абстрагировать интерфейс между моей программой и файловой системой, в которой хранятся файлы, и базой данных, в которой хранятсяметаданные для файлов.Это должно допускать насмешку и юнит-тестирование.Кроме того, я хотел бы иметь возможность создавать несколько реализаций моего инструмента, которые могут использовать различные форматы базы данных и / или структуры файловой системы.
Например, я создал интерфейс IFileSystemAdaptor
, которыйиспользуется для чтения и записи файлов и связанных метафайлов (миниатюр и вложений) в файловую систему.Фактические реализации IFileSystemAdaptor
определяют, где хранятся файлы и в какой структуре.
public interface IFileSystemAdaptor
{
void WriteFileData(string fileName, Stream data);
Stream ReadFileData(string filename);
void DeleteFileData(string filename);
void ClearAllData();
void WriteMetaFileData(string filename, string path, Stream data);
Stream ReadMetaFileData(string filename, string path, Stream data);
void DeleteMetaFileData(string filename, string path);
void ClearMetaFilesData(string filename);
}
Так что теперь я пытаюсь сделать нечто подобное с подключением к базе данных.У меня есть довольно сложная структура классов , которую я хочу читать и записывать в базу данных и из нее.Я хотел бы иметь возможность иметь реализации, которые подключаются к базе данных SQL Server, и другую реализацию, которая использует базу данных без серверов, такую как SQL Lite.
Как я могу абстрагировать слой доступа к данным между моими классами ибаза данных таким образом, который будет поддерживать несколько типов баз данных?Кроме того, как я могу позволить отражать отношения наследования в моих классах в базе данных?Я бы предпочел формат базы данных в соответствии с шаблоном " наследование таблиц классов " (см. Один из моих предыдущих вопросов ).