Это для получается для каждого репозитория нужно писать getter/setter в главном репозитории? Очень много и накладно.
Это можно решать метапрограммированием через Reflection API и дженерики.
Для переключения между субд я решил сделать Фабрику. Но на этом и возник ступор.
Реализации фабрик для этого уже написаны и называются IoC-контейнерами. Принципы работы с ними можно посмотреть
здесь. Ну или где угодно в интернете. Популярные реализации: Castle Windsor, Unity, Ninject и т.п.
Суть в том, что контейнер сначала можно настроить:
interface IMyEntityRepository {...}
class MySqlEntityRpository: IMyEntityRepository {...}
...
config.Bind<IMyEntityRepository>().ImplementsBy<MySqlEntityRpository>();
А потом позвать:
var repo = ioCContainer.Get<IMyEntityRepository>();
Кроме очевидных плюсов, IoC-контейнеры могут:
- собирать полный граф зависимостей по своей таблице (A зависит от B, B от C и т.п., внедряя необходимые реализации автоматически, т.е. мы можем создавать сразу A)
- конфигурироваться без перекомпиляции (autowiring (автоматический поиск реализаций заданных интерфейсов) или по информации из конфиг-файла, вроде XML).