2010-10-27 3 views
4

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

ответ

2

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

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 из хранилища и т.д.

+0

первая ссылка, которую вы мне дали, EF4 CTP4, который в настоящее время является предварительным просмотром ... могу ли я использовать его? – Stefano

+0

CTP поставляется с обновлениями к сообщению. Эти части отмечены, поэтому, если вы не хотите устанавливать CTP, вы можете следить за старым кодом (с помощью ContextBuilder). Если вы просто хотите повторно использовать упакованный исходный код (из загрузок), вы можете установить CTP. – Yakimych

+0

Я ошибаюсь или ctp не лицензирован для производственных приложений? – Stefano

3

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

Малый Respository Pattern Введение:

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» и конкретный класс, расширяющий абстрактный класс «Репозиторий» и реализующий «ISomethingInterface»:

interface ISomethingRepository : IRepository<Banner> 
{ 
} 

И хранилище соответствия для его реализации:

class SeomthingRepository : Repository<Banner>, IBannerRepository 
{ 
} 

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

Вызов этих методов будет супер легко, что путь:

SomethingRepository _repo = new SomethingRepository(); 

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

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

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

+0

Как мне создать приложение?У меня на самом деле 3 проекта в 1 решении: первое - это веб-приложение, второе - фреймворк с моими пользовательскими функциями и т. Д., А последний содержит только файл EDMX с классами POCO, автогенерируемыми дизайнером фреймворка сущности – Stefano

+0

с сущностью framework 4.0 У меня нет класса DataContext, поэтому у меня нет метода GetTable ... Как вы это исправили? – Stefano

Смежные вопросы