Entity Framework 4.0 с классами POCO - Шаблон репозитория? - PullRequest
4 голосов
/ 27 октября 2010

Я пишу веб-приложение asp.net mvc 2 с Entity Framework 4.0. У меня есть представления, которые должны отображать элементы, представления для входа в систему и т. Д. Должен ли я структурировать проект с шаблоном хранилища? Если да, то как? Должен ли я создать интерфейс для основных методов, таких как Add, Update, Delete и т. Д., И другого класса, который использует хранилище для общих методов, таких как проверка входа и т. Д.?

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Я использую EF с шаблоном репозитория, он сохраняет мне чертовски много работы!

Небольшое введение в репозиторий:

someRepository.Find.Where(something => something.IsRed && something.IsBig)

Создайте универсальный интерфейс с именем «IRepository» типа, содержащий все методы для доступа к данным.

Это может выглядеть так:

interface IRepository<T> where T : class
{
    IEnumerable<T> FindAll(Func<T, bool> exp);

    T FindSingle(Func<T, bool> exp);
}   

Создайте абстрактный класс 'Repository', реализующий этот интерфейс:

class Repository<T> : IRepository<T> where T : class
{
    TestDataContext _dataContext = TestDataContext(); // Would be your EF Context

    public IEnumerable<T> FindAll(Func<T, bool> exp)
    {
        _dataContext.GetTable<T>().Where<T>(exp);
    }

    public T FindSingle(Func<T, bool> exp)
    {
        _dataContext.GetTable<T>().Single(exp);
    }
}

Теперь мы можем создать интерфейс для таблицы / объектов something, который реализует наш 'IRepository' и конкретный класс, расширяющий абстрактный класс 'Repository' и реализующий 'ISomethingInterface':

interface ISomethingRepository : IRepository<Banner>
{
}

И соответствующий репозиторий для его реализации:

class SeomthingRepository : Repository<Banner>, IBannerRepository
{
}

Я бы предложил использовать этот подход, поскольку он дает вам большую гибкость и достаточную мощность для управления всеми крошечными объектами, которые у вас есть.

Вызывать эти методы будет очень просто:

SomethingRepository _repo = new SomethingRepository ();

_repo.Find.Where(something => something.IsRed && something.IsBig)

Да, это означает, что вам нужно выполнить какую-то работу, но вам будет гораздо проще изменить источник данных позже.

Надеюсь, это поможет!

2 голосов
/ 28 октября 2010

Наиболее полный ответ, который вы можете получить, вероятно, здесь:

http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/

Довольно много, чтобы прочитать и понять, но если вы действительно хотите понять, как использовать шаблон репозитория с EF, это, вероятно, самый полный источник.

Несколько простых примеров кода для быстрого запуска можно найти здесь:

http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository

Вы также можете найти различные варианты + обсуждения (например, стоит ли возвращать IQueryable's из хранилища и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...