Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EntityFramework и паттерн Repository / 25 сообщений из 121, страница 1 из 5
22.07.2018, 18:39
    #39677384
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
С коллегами на работе сложились разногласия относительно необходимости реализации паттерна Repository в ASP.NET MVC при наличии EntityFramework. Одни говорят, что не требуется, так как уже EF всё реализует, другие (и я в их числе) говорят что он (паттерн Repository) просто немного видоизменился и теперь это не чистый DAL, а еще и Pagination, Row Level Security и Model -> ViewModel mapping и прочие полезности этого слоя.

А как вы считаете?
...
Рейтинг: 0 / 0
22.07.2018, 19:08
    #39677394
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
...
Рейтинг: 0 / 0
22.07.2018, 19:08
    #39677395
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
ссылко не тот! ищи EF Repository
...
Рейтинг: 0 / 0
22.07.2018, 19:10
    #39677396
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
EF + Repository там где постов > 100
...
Рейтинг: 0 / 0
22.07.2018, 19:31
    #39677401
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaА как вы считаете?
Репозиторий - это полная абстракция от системы хранения, а не только от конкретной РСУБД.

К примеру у нас в Абрикосе есть темы: https://www.wildapricot.com/membership-website-themes

С точки зрения хранения - это набор файлов. С точки зрения домена приложения - это корень агрегации Theme.
И вот ThemeRepository по указанной спецификации возвращает нужную тему: оригинальную, или кастомную.
Первая - это набор файлов, что изначально создали мы; последняя - это частично расширенная, или полностью переработанная клиентами.
И вот оригинальных тем относительно мало и они хранятся на машине локально, а кастомных относительно много и они хранятся на сетевой шаре.
И, как Вы понимаете, при каждом запросе собирать корень агрегации с диска, или с сетевой шары, это чертовски нагладно.
Поэтому реализован двухуровневый кэш: MemoryCache + Couchbase. Реализован он через шаблон Декоратор.
Подключается/отключается через IoC.

И при этом для вызывающего кода работа со всем этим выглядит как repository.GetTheme(specification) .
И это не изменится, если сетевая шара будет послана и заменена на микросервис писанный на Go, или на MongoDB GridFS
...
Рейтинг: 0 / 0
22.07.2018, 20:35
    #39677414
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaА как вы считаете?

Вообще, при использовании EF, лепить сверху паттерн Репозиторий совсем не обязательно. В этом есть как и плюсы, так и минусы. Если вы совершенно точно никогда за рамки EF в своих проектах не выйдите, и за рамки одной единственной БД, то не нужен вам этот репозиторий.
...
Рейтинг: 0 / 0
22.07.2018, 20:38
    #39677415
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
Calabonga,

Можно запилить простой generic репозиторий, под каждую сущность, на IQueryable, и это решит ваши концептуальные проблемы в спорах, зато будет больше гибкости, и способности к изменениям вырастут на порядке.

Конечно совсем по феншую это CQS, и отказ от EF, в пользу команд и запросов. Но это дорого на начальном этапе.
...
Рейтинг: 0 / 0
23.07.2018, 07:32
    #39677485
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
Calabongaразногласия относительно необходимостине нужен
...
Рейтинг: 0 / 0
23.07.2018, 10:53
    #39677544
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
hVosttCalabongaА как вы считаете?

Вообще, при использовании EF, лепить сверху паттерн Репозиторий совсем не обязательно. В этом есть как и плюсы, так и минусы. Если вы совершенно точно никогда за рамки EF в своих проектах не выйдите, и за рамки одной единственной БД, то не нужен вам этот репозиторий.

В общем-то, идея понятна. Но хочу тогда уточнить, что есть EntityFramework не реализует Pagination, Row Level Security и Model -> ViewModel mapping, то где реализуете данную логику если не используюте Repository??? Я-то себе сделал nuget обобщенный репозиторий.
...
Рейтинг: 0 / 0
23.07.2018, 11:14
    #39677549
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaВ общем-то, идея понятна. Но хочу тогда уточнить, что есть EntityFramework не реализует Pagination, Row Level Security и Model -> ViewModel mapping, то где реализуете данную логику если не используюте Repository???Например для Pagination удобно использовать расширяющие методы для IQueryable.
...
Рейтинг: 0 / 0
23.07.2018, 11:23
    #39677556
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaEntityFramework не реализует Pagination
А почему нужно все пихать что даже не всегда нужно?
Пагинация нужна строго для грида с пагинацией.
И правильно сказали делается одной строчкой.
Тоже самое и с остальным.
....
Если бы ты показал as is to be и весь ужас сегодняшнего EF тогда конечно.
...
Рейтинг: 0 / 0
23.07.2018, 11:50
    #39677576
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaЯ-то себе сделал nuget обобщенный
Гы... https://aspnetboilerplate.com/Pages/Documents/EntityFramework-Integration
...
Рейтинг: 0 / 0
23.07.2018, 11:53
    #39677580
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaВ общем-то, идея понятна. Но хочу тогда уточнить, что есть EntityFramework не реализует Pagination, Row Level Security и Model -> ViewModel mapping, то где реализуете данную логику если не используюте Repository??? Я-то себе сделал nuget обобщенный репозиторий.

EF реализует Pagination через интерфейсы IQueryable Take/Skip.

В обязанности репозитория не входит обеспечение Row Level Security, реализовывать его там -- вколачивать кривые ржавые костыли.

Посмотри паттерн Спецификация и его реализации на IQueryable (гуглится на раз). Это то, что тебе нужно для сесурыти )

Model -> ViewModel должен делать контроллер, с помощью AutoMapper, например. Это его задача, а не репозитория, который совершенно точно не должен знать и понятий иметь ни о каких вью моделях.
...
Рейтинг: 0 / 0
23.07.2018, 11:55
    #39677581
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
skyANACalabongaЯ-то себе сделал nuget обобщенный
Гы... https://aspnetboilerplate.com/Pages/Documents/EntityFramework-Integration

В общем, кто во что горазд.

Поэтому, на не больших проектах и даже средненьких можно легко обходится без доп. слоя репо, так как EF им и является. А в больших EF и не нужен вовсе
...
Рейтинг: 0 / 0
23.07.2018, 11:59
    #39677589
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaНо хочу тогда уточнить, что есть EntityFramework не реализует Pagination, Row Level Security и Model -> ViewModel mapping, то где реализуете данную логику если не используюте Repository???
One Domain-Driven-Design solution to the problem of where to place querying, sorting, and paging logic is to use a Specification .

https://deviq.com/specification-pattern/
...
Рейтинг: 0 / 0
23.07.2018, 12:01
    #39677594
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
Calabonga,

Посмотрел на нугет, перешёл на сайт, глянул исходники.
Я считаю, что разделение на ReadableRepositoryBase и Writeable это ошибка.
Репозиторий по своей сути, это набор методов:

GetById
Add
Remove
Update

Это идеальный во всех смыслах репозиторий. Отсадить выполнение запросов надо не в репозиторий "только для чтения" -- это немного асбурдно, так как репо хранит объекты, сущности, а результы запроса самые разные, далеко не сущности, а некие проекции, аггрегации, суммы, группировки. Это все не задачи репозитория.

Т.е. надо IRepository и типа IQueryService если уж на то пошло. IQueryService принимает либо Query Object, либо работает со спецификациями и позволяет теребонькать за IQueryable.
...
Рейтинг: 0 / 0
23.07.2018, 12:06
    #39677597
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
hVosttCalabonga,

Посмотрел на нугет, перешёл на сайт, глянул исходники.
Я считаю, что разделение на ReadableRepositoryBase и Writeable это ошибка.
Репозиторий по своей сути, это набор методов:

GetById
Add
Remove
Update

Это идеальный во всех смыслах репозиторий. Отсадить выполнение запросов надо не в репозиторий "только для чтения" -- это немного асбурдно, так как репо хранит объекты, сущности, а результы запроса самые разные, далеко не сущности, а некие проекции, аггрегации, суммы, группировки. Это все не задачи репозитория.

Т.е. надо IRepository и типа IQueryService если уж на то пошло. IQueryService принимает либо Query Object, либо работает со спецификациями и позволяет теребонькать за IQueryable.
Мы же это вроде как обсуждали уже в мае
...
Рейтинг: 0 / 0
23.07.2018, 12:07
    #39677600
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
skyANAМы же это вроде как обсуждали уже в мае

Повторение матерь учения :)
...
Рейтинг: 0 / 0
23.07.2018, 17:50
    #39677849
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
hVostt,


Выставлять IQueryable наружу это мовитон, ибо с юнит тестами к нему не подлезешь. А то что сборка разбита на две части, это только плюс, потому что в зависимости от ролей пользователя он получит только то, что можно. Очень удобно инжектить. Да реализация проще, например есть только сайты для чтения fate name.ru например. Думаю позже на два пакета разбить, чтобы ставить только то, что нужно.

А что касается "идельного", ты вы же сказали, что модно и без него если есть EF... :)
...
Рейтинг: 0 / 0
23.07.2018, 17:52
    #39677851
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
hVostt,


Думаю вам нужно ознакомиться с плюсами и минусами выставления наружу IQueryable. Не все так гладко в этом вопросе.
...
Рейтинг: 0 / 0
23.07.2018, 18:08
    #39677859
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
А кто тут предлагал выставлять его наружу? Только в сервисный слой.
Или что такое "ружа" в вашем понимании?
...
Рейтинг: 0 / 0
23.07.2018, 18:10
    #39677861
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaА что касается "идельного", ты вы же сказали, что модно и без него если есть EF... :)
Можно вообще никакие паттерны не использовать в проекте, где есть EF, не пристрелят
...
Рейтинг: 0 / 0
23.07.2018, 18:17
    #39677871
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaА то что сборка разбита на две части, это только плюс, потому что в зависимости от ролей пользователя он получит только то, что можно.В плане? Запретить какой-то роли писать, какой-то читать в рамках одного репозитория? Легко.

CalabongaОчень удобно инжектить.Один generic repository тоже очень удобно инжектить.

CalabongaДа реализация проще, например есть только сайты для чтения fate name.ru например.Дык реализуйте метод GetById, а в методах Add, Remove, Update киньте исключение: "Ай, ай, ай, у нас сайт только для чтения, какой суке понадобилось дёрнуть Add?!"

А вообще давно уже придумали CQS.
...
Рейтинг: 0 / 0
23.07.2018, 18:31
    #39677880
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
Shocker.ProА кто тут предлагал выставлять его наружу? Только в сервисный слой.
Или что такое "ружа" в вашем понимании?+1 Moжно и в модели, если она чуть толще голых сущностей.
Ну и потом он десктоп забыл.
Все его примеры от MVC web идут.
...
Рейтинг: 0 / 0
23.07.2018, 19:05
    #39677897
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EntityFramework и паттерн Repository
CalabongaНе все так гладко в этом вопросе.увы.
В жизни все не гладко).
Вот MS взяло и сделало реализацию репозитария в виде DBSet<T>
И поди докажи что у тебя репо лучше) и программистам легче).
Дописывать EF это все равно что Мону Лизу дорисовывать).
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EntityFramework и паттерн Repository / 25 сообщений из 121, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]