Я пишу приложение, которое используется для каталогизации файлов, и атрибут этих файлов с метаданными. Программа фотоальбома будет хорошим сравнением с тем, что я пытаюсь сделать.Попытка понять, как абстрагироваться от уровня доступа к данным
Я пытаюсь абстрагировать интерфейс между моей программой и файловой системой, в которой хранятся файлы, и база данных, в которой хранятся метаданные для файлов. Это позволяет производить издевательское и модульное тестирование. Кроме того, я хотел бы иметь возможность создавать несколько реализаций моего инструмента, которые могут использовать различные форматы базы данных и структуры файловой системы.
Например, я создал интерфейс, 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);
}
Так что теперь я пытаюсь сделать что-то подобное с подключением к базе данных. У меня есть fairly complex structure of classes, который я хочу читать и писать в базу данных и из нее. Я бы хотел иметь возможности, связанные с базой данных SQL Server, и другую реализацию, использующую безсерверную базу данных, такую как SQL Lite.
Как я могу отделить уровень доступа к данным между моими классами и базой данных таким образом, чтобы поддерживать несколько типов баз данных? Также как я могу позволить отношениям наследования в моих классах отражаться в базе данных? Я бы предпочел формат базы данных, следующий за шаблоном «class table inheritance» (см. Один из моих previous questions).
Да, я тоже прихожу к этому выводу. Я, конечно, не хочу изобретать велосипед. Я изучал SubSonic, и теперь я рассматриваю NHibernate. Одна из проблем, которые есть у меня, - это то, что я хотел бы, чтобы любое решение, которое я выбрал, позволял «Наследование класса» (http://martinfowler.com/eaaCatalog/classTableInheritance.html). Из того, что я вижу, субзвук всегда хочет сохранить все свойства класса (унаследованного или нет) в соответствующей таблице для этого класса. Может ли NHibernate отображать отношения наследования в отдельные таблицы? –
Думаю, что так. nhibernate является одним из самых зрелых ORM для .net. Он существует с 2003 года, когда он был перенесен из Javas Hibernate. Взгляните на этот пост (не знаю, если это поможет): http://ayende.com/Blog/archive/2009/04/10/nhibernate-mapping-ndash-inheritance.aspx – jgauffin
Вы также можете свободно смотреть на nhibernate, если вы не хотите использовать XML-файлы для сопоставления таблиц с вашими классами. http://wiki.fluentnhibernate.org/Fluent_mapping#Subclasses – jgauffin