Я реализовал это в своей компании, создав многоразовую библиотеку репозитория.
По сути, я создал абстракцию репозитория с интерфейсами, которая выполняет базовые операции CRUD над переданным объектом или набором объектов. Затем я реализовал это, используя различные механизмы сохранения. Библиотека может сохранять любой объект в XML, JSON, Binary или SQL. Все эти репозитории используют одни и те же интерфейсы, поэтому весь код, который должен взаимодействовать с репозиторием, использует интерфейсы, а не конкретные реализации. Каждая реализация, как и абстракции, живет в своей собственной библиотеке, поэтому вам нужно только распространять библиотеку абстракций и любую реализацию, в которой нуждается ваша программа.
Ничего не нужно реализовывать в объектной модели, потому что она обрабатывает общие объекты, используя Reflection (библиотека написана на C # для .Net).
Я также оставил репозитории открытыми для расширения, и в некоторых приложениях материал на основе Reflection по умолчанию заменяется строго типизированными репозиториями, которые более эффективны, но все еще основаны на общих реализациях.
Надеюсь, это поможет.