Как организовать паттерн «репозиторий» с возможностью переключаться на разные СУБД, а именно в c#?
Это для получается для каждого репозитория нужно писать 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).
3. Каноничный репозиторий должен уметь только CRUD. Посмотрите в сторону CQRS. В этом вопросе как раз Queries и подойдут.
Ещё рекомендую почитать про Domain Driven Design (DDD), например Эрик Эванс.