В основном из любопытства я ищу фреймворк Python или пример для шаблона репозитория, который отделяет логику постоянства от логики домена.
Название «Шаблон репозитория» появляется в сообщении «Untangle Domain and Persistence Logic with Curator» (Ruby), идея взята из разделакниги «Domain-Driven Design» и Martin FowlerКласс модели не содержит логики персистентности, скорее приложение объявляет подклассы репозитория, экземпляры которых действуют как колле в памяти. действия экземпляров модели. Каждый репозиторий сохраняет модель по-разному, например, в SQL (различные соглашения о схеме), в Riak или другом noSQL и в памяти (для кэширования).Соглашения фреймворка означают, что подклассы репозитория обычно требуют минимального кода: простое объявление подкласса WidgetRepository для SQLRepository предоставит коллекцию, которая сохраняет виджет модели в таблице БД с именем «виджеты» и сопоставляет столбцы с атрибутами виджета.
Отличия от других шаблонов:
Шаблон Active Record: например, Django ORM. Приложение определяет только класс модели с логикой предметной области и некоторыми метаданными для сохранения. ORM добавляет логику постоянства в класс модели. Это смешивает домен и постоянство в одном классе (нежелательно, согласно сообщению).
Благодаря @marcin я вижу, что, когда Active Record поддерживает различные бэкенды и функцию .save(using="other_database"), это дает преимущество шаблона репозитория с несколькими бэкендами.
Таким образом, шаблон репозитория в некотором смысле похож на Active Record, но логика сохраняемости перемещена в отдельный класс.
Шаблон сопоставления данных: например, классические сопоставления SQLAlchemy. Приложение определяет дополнительные классы для таблиц базы данных и преобразователи данных из модели в таблицу (таблицы). Таким образом, экземпляр модели может быть сопоставлен с таблицами несколькими способами, например. для поддержки устаревших схем. Не думайте, что SQLAlchemy предоставляет средства сопоставления с хранилищем, отличным от SQL.