Здравствуйте.
Пишу на c#. Но язык не важен по большей части.
У меня есть библиотека, в которой я работаю с данными из БД. Для того, чтобы не писать запросы в базу даных для типичных операций, я решил организовать доступ к базе данных через паттерн "Репозиторий", главный класс которого умеет делать CRUD (обобщенный класс). Этот класс я наследую, когда нужно создать конкретный репозиторий. Например:
Репозиторий новостей, репозиторий пользователей и так далее. Фактически для каждой таблицы у меня свой репозиторий, который умеет CRUD и иногда что-то специфическое, например, для новостей есть метод "FindByUrl" и так далее.
Работаю сейчас с mysql. Поэтому, в проекте у меня есть папка Repositories/Mysql, в которой и находятся все файлы репозиториев.
В будущем планируется переходить просто переключением на другие субд. Я подумал как это реализовать и для этого для каждого репозитория создал свой интерфейс. Теперь для другой субд мне просто нужно по интерфейсам создать папку Repositories/OtherBD и в ней создавать репозитории.
Для переключения между субд я решил сделать Фабрику. Но на этом и возник ступор. И возник ряд вопросов, на которые, прошу совета:
- Получается теперь для каждого репозитория я должен писать свою фабрику? Можно ли это сделать одной фабрикой, чтобы выбрал субд и потом просто вызываешь необходимый репозиторий ?
- Является ли мой подход избежания sql запроса в коде и переключения субд в программе правильным? Есть ли другие варианты?
- Для паттерна "Репозиторий" верно ли постоянно наращивать методы, такие как "FindByUrl"? Если нет, то какие предложение? А если Нужно выборка по двум репозиториям(фактически join)?
P.S. По первому пункту думал создать типа Репозитория репозиториев, который в себе хранит все репозитории и потом по необходимости он их просто выдает. Например, MysqlRepo имеет методы - GetNewsRepo, GetUsersRepo и так далее. Но репозиториев будет минимум 30. Это для получается для каждого репозитория нужно писать getter/setter в главном репозитории? Очень много и накладно.
Может для .net есть решение?