Уровень доступа к данным. Все данные хранятся в файле формата .txt. Доступ на чтение и запись осуществляется через собственную реализацию хранилища. Каждая сущность имеет связанный с ней одноименный текстовый файл. Для разделение полей и строк в файле используются нечитаемые символы. Перед записью данных файл создается backup, который по успешному выполнению транзакции удаляется.
Взаимодействие с хранилищем более высокоуровневых сервисов происходит через провайдер, который связан с обобщенным репозиторием. При обращении к обобщенному репозиторию, тот использует специальный класс для построения запросов и обращения непосредственно к хранилищу.
Все данные кэшируются. При запросе на получение данных репозиторий сначала пытается получить данные из кэша, если кэш пустой, то формируются запросы на получение данных по всем сущностям, которые затем помещаются в специальный словарь внутри кэша. При дальнейших запросах данные извлекаются непосредственно из кэша.
Кэш может также терять свою актуальность. Это происходит при операциях на изменение данных, тогда при последующем запросе на чтение, хранилище определит, что кэш требуется обновить и вновь повторит процедуру чтения из файлов и обновления кэша.
Операция на изменение данных также происходят через обобщенный репозиторий, который строит запрос и отправляет его в хранилище, которое затем производит чтение такого запроса. Хранилище имеет такое устройство, что позволяет выполнять отложенные транзакции. Например, если мы вызвали метод Add в провайдере и передали некоторый экземпляр сущности, то репозиторий создаст запрос к хранилищу на добавление данных, в хранилище метод Execute произведет необходимые преобразования, сформирует готовый конечный набор данных готовый к записи и поместит их с метаданными в пул транзакций. Только после явного вызова Commit происходят применение всех изменений и их запись в файлы-таблицы. Если во время выполнения транзакции происходит сбой, то происходит откат всех изменений из файла backup. За преобразование данных в текстовый формат и обратно в сущности отвечает обобщенный интерпретатор.