|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|||||||||||||||||||||
Рассуждения о Generic Repository паттерне02.10.2014, 21:07. Показов 4496. Ответов 19
Метки нет (Все метки)
Добрый день.
Хотелось бы прояснить для себя следующий момент. Вот есть у нас обобщенный репозиторий
Или, все-таки, поскольку FindAll возвращает IQueryable, и т.к. Where мы вызываем на объекте IQueryable - то отбор по Where происходит в БД? Оченно интересный вопрос.... Спасибо.
0
|
|||||||||||||||||||||
| 02.10.2014, 21:07 | |
|
Ответы с готовыми решениями:
19
Generic Repository без Entity
Вопрос о паттерне MVP |
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
|
| 02.10.2014, 21:16 | |
|
Where на IQueryable приведет к фильтрации множества на стороне источника данных (базы данных)
Where на IEnumerable приведет к запросу полного множества и фильтрации его на клиенте. В Вашем случае Where вызывается на IQueryable, значит, отбор произойдет в БД. Есть видео по этой теме: https://www.youtube.com/watch?v=hIjtj3b8XPg Примерно с 18 минуты как раз на примере показывается разница.
0
|
|
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
||||||
| 02.10.2014, 21:34 [ТС] | ||||||
|
Defazze, Спасибо за отклик! Разницу между Нумерабле и Кверибл я понимаю вроде... Собственно так, как вы написали - я и думал. Но тут вот в чем вопрос:
нафига каждый освещающий паттерн Дженерик Репозитори в сети непременно снабжает его дополнительными методами типа:
0
|
||||||
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
|
| 02.10.2014, 21:38 | |
|
А как иначе выполнять фильтрацию по условию в рамках этого паттерна?
Не по теме: не говоря уже о том, что лично у меня есть большие сомнения в полезности данного паттерна )
0
|
|
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|||||||||||||||||
| 02.10.2014, 21:49 [ТС] | |||||||||||||||||
Добавлено через 4 минуты Вот кстати запрос для var query через productRepository.FindAll().Where(p=>p.I D==3)
0
|
|||||||||||||||||
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
| 02.10.2014, 21:52 | ||||||
|
Совершенно верно. И тут возникает вопрос: а зачем тогда репозиторий? Какая разница между вызовами этих методов и
0
|
||||||
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|
| 02.10.2014, 21:56 [ТС] | |
|
0
|
|
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
|
| 02.10.2014, 21:59 | |
|
С моей точки зрения, репозиторий должен возвращать конечный набор сущностей, т.е. IEnumerable. Инкапсулируя в себе полностью всю работу с источником данных. Тогда и юнит-тесты будет писать легко и приятно, и не возникнет никаких скрытых запросов к БД через торчащий наружу IQueryable.
Но это сугубо моё имхо.
0
|
|
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|
| 02.10.2014, 23:25 [ТС] | |
|
Благодарю за беседу! Нужно вашу последнюю мысль обмозговать... Похоже, вы правы...
Добавлено через 1 час 19 минут Defazze, Я мало-мало подумал и вот что пришло в голову... как сразу не сообразил, перегрев, видать... Преимущество Репозитория то основное не в юнит-тестинге а в слабой связанности компонентов. Репозиторий то инкапсулирует источник данных, как вы справедливо заметили. Так вот если в Контроллерах вы будете использовать DbContext, то при смене источника данных вам прийдется долго править стопитсот Контроллеров. В сслучае же передачи интерфейса Репозитория в Контроллер вам нужно будет лишь написать новую "прокладку", реализующую этот интерфейс для нового источника данных. И вот тут таки вы правы - IQueryable торчать не должен. Хотя... почему не должен? Вполне может себе и торчать, это ни на что не повлияет, и на тестирование в том числе. Мы при тестировании что проверяем? Правильность возвращенного методом Контроллера набора данных. Что нам тот торчащий IQueryable? Он может помешать только при изменении предметной области... Но при таком изменении и IEnumerable с GetByFilter не спасет - все одно прийдется править. Т.о. GetByFilter таки нафик не нужны, а Репозиторий пользителен (как часто меняется источник данных - не обсуждаем). Ну и пейсатели из блогов про Дженерик Репозитори пишут, получается, сами не зная что. Или я таки не прав?
0
|
|
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
| 02.10.2014, 23:35 | ||||||
|
Я ж не против репозиториев. Они очень даже полезны - как еще один слой абстракции (если этот слой необходим). Насчет IQueryable - с моей точки зрения, задача репозитория - возвращать конечное множество. Слой бизнес-логики не должен формировать запросы к БД. Он отдал репозиторию параметры, получил данные, всё. А торчащий IQueryable приводит к тому, что в бизнес-логике возникают монстры типа
А паттерн, ну да, есть такой паттерн. Можно применять. Особой пользы это не приносит.
0
|
||||||
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|||||||
| 03.10.2014, 00:14 [ТС] | |||||||
Defazze, а как вы объект dbContext получаете в Контроллере?
0
|
|||||||
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
| 03.10.2014, 08:05 | ||||||
|
да, есть навигационные свойства. Но они ситуацию не улучшают. Сравните со следующим кодом:
Я с dbContext работаю только на уровне репозиториев. Ни бизнес-логика, ни тем более контроллеры о нем понятия не имеют.
1
|
||||||
|
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
|
|||
| 03.10.2014, 14:37 [ТС] | |||
|
Defazze, огромное вам спасибо! Я че то заблукал малость. Беседа с вами помогла все разложить по полочкам и сформировать четкую картину.
Вы безусловно правы, методы репозитория должны возвращать конечный набор. И по торчащему IQueryable тоже правы. Ну а Дженерик - действительно ненужная штука. А при большом кол-ве сущностей предметной области еще и вредная: его реализация в таком случае в силу отличий между сущностями выльется в черт те что и черт те как. Еще раз спасибо! Добавлено через 1 час 3 минуты Не, ну а пейсатели все равно такие пейсатели. У них же у 90 процентов IQueryable возвращается из Дженерик Репозитори... А у многих все одно потом еще ЛИНК на этот Кверибл навинчивается, прошивая все насквозь...
0
|
|||
|
Заблокирован
|
|
| 06.10.2014, 20:38 | |
|
Defazze, немного не понял, где нужно возвращать IEnumerable из репозитория? в каких случаях?
если я везде так буду делать у меня кончится память. я понял, что IQueryable для уменьшения накладных расходов на память, а IEnumerable для увеличения скорости запроса. Добавлено через 2 минуты или я немного о другом?
0
|
|
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||
| 06.10.2014, 20:59 | ||
0
|
||
|
Заблокирован
|
|||||||||||||||||||||
| 06.10.2014, 21:43 | |||||||||||||||||||||
|
если в базе данных мало данных, а сами сущности занимают много места в памяти?
Добавлено через 1 минуту Defazze, или я что-то непонимаю
0
|
|||||||||||||||||||||
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
| 06.10.2014, 22:11 | ||||||
|
Вот здесь:
Т.е. конечным итогом работы IQueryable всё равно является IEnumerable.
0
|
||||||
|
Заблокирован
|
|
| 06.10.2014, 22:19 | |
|
Defazze, т.е если элемент один, то один и превратится в IEnumerable?
0
|
|
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
|
| 06.10.2014, 22:48 | |
|
ну это смотря как преобразовывать. Если ToList, то будет List. Если First, Single и пр., то будет один элемент.
0
|
|
|
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
|
|
| 06.11.2014, 22:57 | |
|
У вас недоделанный репозиторий, лучше делать не класс генерик, а методы
0
|
|
| 06.11.2014, 22:57 | |
|
Помогаю со студенческими работами здесь
20
Отрицание конкретного слова в паттерне
Первое вхождение слова в паттерне Использование диалогов в MVVM паттерне Путь к файлам в MVC паттерне Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|