• Как организовать паттерн "репозиторий" с возможностью переключаться на разные СУБД, а именно в c#?

    @chibitko
    Нужно было использовать ORM - это уже и Generic Repository и Unit Of Work.
    Например Entity Framework. Используя EF Code First и разные Entity Configurations (в общем случае достаточно одних), можно легко решить вашу задачу переключения между БД, меняя строку подключения и DB-провайдер.
    И не будет проблем с JOIN.
    Не нравится EF - используйте Dapper.net, легкая и быстрая ORM, на ней целый stackoverflow работает
    Ответ написан
    Комментировать
  • Как организовать паттерн "репозиторий" с возможностью переключаться на разные СУБД, а именно в c#?

    @BaredJJ
    Контейнеры вещь очень хорошая, но чтобы ими пользоваться нужно знать и применять методики гибкой разработки. Просто наличие контейнера еще не избавляет код от ужасных зависимостей. Так что прочитайте вначале про инверсию зависимостей. Есть даже книга на русском: "Инверсия зависимостей в .Net".
    Ответ написан
    Комментировать
  • Как организовать паттерн "репозиторий" с возможностью переключаться на разные СУБД, а именно в c#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Это для получается для каждого репозитория нужно писать 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-контейнеры могут:
    1. собирать полный граф зависимостей по своей таблице (A зависит от B, B от C и т.п., внедряя необходимые реализации автоматически, т.е. мы можем создавать сразу A)
    2. конфигурироваться без перекомпиляции (autowiring (автоматический поиск реализаций заданных интерфейсов) или по информации из конфиг-файла, вроде XML).
    Ответ написан
    6 комментариев