Ваш текущий API является реализацией Active Record Pattern .
Этот шаблон работает нормально, когда объектная модель, используемая в коде, совпадает один на один с моделью базы данных. Другое преимущество состоит в том, что существуют инструменты для генерации этих классов, включая постоянный код и таблицы базы данных.
Альтернативой, которую вы предлагаете, является Шаблон репозитория.
Как вы уже упоминали, реализация немного сложнее, но имеет ряд преимуществ.
Поскольку вы можете реализовать любой вид инструмента ORM, вы не ограничены отображениями «один на один», но можете реализовать более сложные отображения, в которых объектная модель может отличаться от модели базы данных. Таким образом, вам не нужно навязывать объектную модель в базе данных или наоборот.
Однако более сложные сопоставления, кроме одного на одном, не могут быть сгенерированы и требуют некоторого
Другое преимущество заключается в том, что вы можете создавать тесты проще, поскольку вы можете создать репозиторий Mock, который даже не требует базы данных.
Используя Шаблон репозитория, вы также отделяете модель от логики постоянства.
В обеих ситуациях возможно написать методы персистентности в общем виде, так что код персистентности является универсальным и не нужно знать о конкретном объекте, который необходимо сохранить. Это очевидно для шаблона активной записи, поскольку все эти объекты реализуют сохранение, удаление, обновление и т. Д. Для шаблона репозитория вы также можете использовать инструменты ORM, которые работают с любым объектом, так что код, подобный этому, возможен:
Repository.Save(ObjectOfAnyType);
ObjectOfAnyType может быть любым, если в инструменте ORM определено / реализовано некоторое отображение для типа объекта.
Таким образом, вы выбираете, хотите ли вы или нуждаетесь в этих преимуществах за счет небольшой дополнительной сложности. Или достаточно простоты шаблона активной записи.
Я всегда склонен использовать шаблон репозитория, но иногда использовал шаблон активной записи, в основном для быстрого прототипирования.