none
Работа с паттерном "Репозиторий" RRS feed

  • Вопрос

  • Здравствуйте, подскажите пожалуйста:

    Использую паттерн "Репозиторий" в связке с Entity FrameWork
    Но до конца не понимаю:
    Стоит задача, например, получить выборку из базы всех всех значений электронной почты.

    1. Создаю репозиторий:

    namespace Library.Data.Interfaces
    {
        public interface IRepository<TEntity> where TEntity: class
        {
    
        }
    }

    2. Создаю интерфейс, который будет наследоваться от репозитория:

    namespace Library.Data.Interfaces
    {
        public interface IMembership: IRepository<Membership>
        {
            bool IsExistsEmail(string email);
        }
    }

    3. Создаю класс таблицы, в одном из столбце которой хранится список электронных почт пользователей.

    namespace Library.Data.Interfaces
    {
        public interface IMembership: IRepository<Membership>
        {
            bool IsExistsEmail(string email);
        }
    }

    Подскажите:
    1. если мне нужно объединять таблицы, то нужно выносить на более высокий уровень абстракции эту работу? Создавать ещё один слой?
    2. Если у меня нет необходимости делать все операции стандартные(delete, update, select) для таблицы, то зачем все пишут эти методы внутри репозитория?
    3. Entity Framework технология Microsoft, существуют ли хорошие адаптеры или провайдеры для работы с базами данных других производителей, например EF работает с Oracle?



    18 июля 2012 г. 7:38

Ответы

  • 3. Entity Framework технология Microsoft, существуют ли хорошие адаптеры или провайдеры для работы с базами данных других производителей, например EF работает с Oracle?

    В декабре 2011 Oracle выпустил ODAC 11.2 R4 (11.2.0.3.0) с поддержкой Entity Framework. ODAC поставляется с интеграцией в Visual Studio 2010 и может быть загружен по следующий ссылке http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html . Кроме этого есть сторонние разработки от  DataDirect и DevArt.

    Вот тут полный (почти) список адаптеров данных, почти все поддерживают EF.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 7:59
    Модератор
  • Говоря простым языком, паттерн "Репозиторий" - это своего рода посредник, дополнительный слой между: непосредственно хранилищем (в вашем случае это ORM Entity Framework) и кодом, который работает с этим хранилищем данных. Основная идея его сделать компоненты программы слабосвязанными, унифицированными. Ваш код знает только репозиторий и работает с ни по контракту (с использованием интерфейсов), а классы реализующие этот контракт уже могут работать с любым видом хранилища  и в случае перехода на новый поставщик данных(например NHibernate, или вообще на совсем другой источник не связанный с БД), вам не нужно будет переписывать весь код, а достаточно лишь переписать ту часть которая работает с другим поставщиком(реализовать интерфейсы). Очень хорошо про это изложено в книгах: "ASP.NET MVC Framework" Гайдар Магдануров, Владимир Юнев, "ASP.NET MVC Framework с примерами на C# для профессионалов" Стивен Сандерсон. Прочтите разделы связанные с использованием модели, про репозиторий там несколько страниц, но всё очень подробно объясняется, даже если Вы не используете MVC.

    "если мне нужно объединять таблицы, то нужно выносить на более высокий уровень абстракции эту работу? Создавать ещё один слой?" - репозиторий использует принцыпы ОПП, он знать не знает, что такое таблица и прочее, источником данных может быть и не реляционная БД. Его основная задача передать эти данные, а как они получаются (объединением таблиц и т.п.) еме это не интересно.

    "Если у меня нет необходимости делать все операции стандартные(delete, update, select) для таблицы, то зачем все пишут эти методы внутри репозитория?" обычно нужно не только читать, но модифицировать данные. Если у Вас нет нужды - не пишите.

    " Entity Framework технология Microsoft, существуют ли хорошие адаптеры или провайдеры для работы с базами данных других производителей, например EF работает с Oracle?" - EF умеет работать c Oracle. Можно выбрать альтернативную ORM, например NHibernate.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 8:25
    Модератор
  • У Вас там чересчур много абстракций, а это плохо. Например интерфейс

    namespace Library.Data.Interfaces
    {
        public interface IRepository<TEntity> where TEntity: class
        {
    
        }
    }

    вообще лишний. Репозиторием в данном случае может быть

    namespace Library.Data.Interfaces
    {
        public interface IMembershipRepository:
        {
            bool IsExistsEmail(string email);
        }
    }

    код будет работь используя его. А с данными будет работать класс его реализующий.

    namespace Library.Data.Interfaces
    {
        public interface MembershipRepository: IMembershipRepository
        {
            bool IsExistsEmail(string email);
        }
    }

    При переходе на новый поставщик данных, Вам нужно будет только создать новый класс MembershipRepository.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 8:33
    Модератор

Все ответы

  • 3. Entity Framework технология Microsoft, существуют ли хорошие адаптеры или провайдеры для работы с базами данных других производителей, например EF работает с Oracle?

    В декабре 2011 Oracle выпустил ODAC 11.2 R4 (11.2.0.3.0) с поддержкой Entity Framework. ODAC поставляется с интеграцией в Visual Studio 2010 и может быть загружен по следующий ссылке http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html . Кроме этого есть сторонние разработки от  DataDirect и DevArt.

    Вот тут полный (почти) список адаптеров данных, почти все поддерживают EF.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 7:59
    Модератор
  • Говоря простым языком, паттерн "Репозиторий" - это своего рода посредник, дополнительный слой между: непосредственно хранилищем (в вашем случае это ORM Entity Framework) и кодом, который работает с этим хранилищем данных. Основная идея его сделать компоненты программы слабосвязанными, унифицированными. Ваш код знает только репозиторий и работает с ни по контракту (с использованием интерфейсов), а классы реализующие этот контракт уже могут работать с любым видом хранилища  и в случае перехода на новый поставщик данных(например NHibernate, или вообще на совсем другой источник не связанный с БД), вам не нужно будет переписывать весь код, а достаточно лишь переписать ту часть которая работает с другим поставщиком(реализовать интерфейсы). Очень хорошо про это изложено в книгах: "ASP.NET MVC Framework" Гайдар Магдануров, Владимир Юнев, "ASP.NET MVC Framework с примерами на C# для профессионалов" Стивен Сандерсон. Прочтите разделы связанные с использованием модели, про репозиторий там несколько страниц, но всё очень подробно объясняется, даже если Вы не используете MVC.

    "если мне нужно объединять таблицы, то нужно выносить на более высокий уровень абстракции эту работу? Создавать ещё один слой?" - репозиторий использует принцыпы ОПП, он знать не знает, что такое таблица и прочее, источником данных может быть и не реляционная БД. Его основная задача передать эти данные, а как они получаются (объединением таблиц и т.п.) еме это не интересно.

    "Если у меня нет необходимости делать все операции стандартные(delete, update, select) для таблицы, то зачем все пишут эти методы внутри репозитория?" обычно нужно не только читать, но модифицировать данные. Если у Вас нет нужды - не пишите.

    " Entity Framework технология Microsoft, существуют ли хорошие адаптеры или провайдеры для работы с базами данных других производителей, например EF работает с Oracle?" - EF умеет работать c Oracle. Можно выбрать альтернативную ORM, например NHibernate.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 8:25
    Модератор
  • У Вас там чересчур много абстракций, а это плохо. Например интерфейс

    namespace Library.Data.Interfaces
    {
        public interface IRepository<TEntity> where TEntity: class
        {
    
        }
    }

    вообще лишний. Репозиторием в данном случае может быть

    namespace Library.Data.Interfaces
    {
        public interface IMembershipRepository:
        {
            bool IsExistsEmail(string email);
        }
    }

    код будет работь используя его. А с данными будет работать класс его реализующий.

    namespace Library.Data.Interfaces
    {
        public interface MembershipRepository: IMembershipRepository
        {
            bool IsExistsEmail(string email);
        }
    }

    При переходе на новый поставщик данных, Вам нужно будет только создать новый класс MembershipRepository.

    • Помечено в качестве ответа ansi_str 19 июля 2012 г. 3:31
    18 июля 2012 г. 8:33
    Модератор