Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: EntityFramework и паттерн Repository  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Calabonga
Выставлять IQueryable наружу это мовитон, ибо с юнит тестами к нему не подлезешь.


Честно говоря, сколько слышу по моветоновость IQueryable, так и не увидел ни одного примера с ним, где могут быть проблемы. Тестировать IQueryable совсем не сложно, вариантов несколько, от тупого List, который сидит за IQueryable, до разбора выражения, но это уже паранойя :)

Calabonga
А то что сборка разбита на две части, это только плюс, потому что в зависимости от ролей пользователя он получит только то, что можно.


Отделять чтение от записи, это правильно, поэтому придумали CQS. Но у вас не CQS, вы просто распилили интерфейсы, без видимого профита. И запросы у вас нельзя писать отдельно. Нельзя собирать запросы из частей, например, взять спецификации безопасности и дополнить бизнес-фильтрами так, чтобы это можно было писать, сопровождать и тестировать по-отдельности. У вас нельзя.

Учитывая, что в EF запись ведётся через трекинг, ваши интерфейсы WriteOnly не имеют смысла абсолютно. На EF без проекций вообще нельзя сделать адекватный CQS.

Очень плохо, что вы вью-модели протащили на уровень репозитариев. Это прям кричащее нарушение всех принципов проектирования.

Calabonga
А что касается "идельного", ты вы же сказали, что модно и без него если есть EF... :)


Да, потому что лишние прослойки может быть overengineering, который таки полезен для обучения и для практики, но может просто увеличить время разработки без видимого профита.

Calabonga
Думаю вам нужно ознакомиться с плюсами и минусами выставления наружу IQueryable. Не все так гладко в этом вопросе.


За всю свою практику в десятках проектов от больших и малых, я никаких минусов не увидел. Это замечательный интерфейс, с которым удобно работать и который прячет подробности реализации: на IQueryable может быть как List, так и БД. Да, его можно скрыть за спецификациями, и это будет в плюс. Но плюс будет в том, что вы таким образом сможете комбинировать запросы, писать и сопровождать их отдельно, также исправлять и дорабатывать эти запросы, без необходимости ковыряться в прикладном коде.
24 июл 18, 06:17    [21596154]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Calabonga
Member

Откуда: www.calabonga.net
Сообщений: 213
Спасибо всем участникам, много интересного подчеркнул для себя.
29 июл 18, 17:58    [21612131]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
не подчерпнул? Именно подчеркнул?

К сообщению приложен файл. Размер - 21Kb
29 июл 18, 18:20    [21612177]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Calabonga
Member

Откуда: www.calabonga.net
Сообщений: 213
Хотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification.

Конструктивная критика приветствуется.

Calabonga.SpecRepositoryCore
7 сен 18, 19:02    [21668548]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
love_bach
Member

Откуда:
Сообщений: 398
Calabonga
Хотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification.

Конструктивная критика приветствуется.

Calabonga.SpecRepositoryCore


а где исходники?
7 сен 18, 19:04    [21668552]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
love_bach
Member

Откуда:
Сообщений: 398
хотя не понимаю, что там может быть нового в репозитории.
"на базе Specification" - это уже звучит как-то странно
7 сен 18, 19:12    [21668554]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Calabonga
Member

Откуда: www.calabonga.net
Сообщений: 213
love_bach,

В самом территории - Ничего! А вот реализации бывают разные! Это надо понимать! :)
8 сен 18, 03:45    [21668766]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Calabonga
Конструктивная критика приветствуется.
ну вы должны понимать, что из за ef паттерном интересуются меньше.
8 сен 18, 23:03    [21669074]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Calabonga,

Если исходников нет, хотя бы сгенерируйте документацию АПИ, это не сложно.
11 сен 18, 01:10    [21670400]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Calabonga
Member

Откуда: www.calabonga.net
Сообщений: 213
hVostt,


Если подскажите как сгенерироваться - буду весьма признателен
11 сен 18, 05:25    [21670429]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Calabonga,

Нужно поставить, чтобы при сборке генерились XML из комментариев.

А потом заюзать тулузу, например такую: https://dotnet.github.io/docfx/
19 сен 18, 02:58    [21678909]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Lessyp
Member

Откуда:
Сообщений: 113
Как-то не увидел в дискурсии как именно к этому народ собственно подходит.
Есть 2 очевидных подхода:

- Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса. Из минусов плохая читаемость, нагромождение кода, возможно дублирование логики запросов, ужасы при юнит-тестировании
- Использовать репозиторий: 2 разновидности, с IQuerable и без.
-а) IQuerable: Из минусов ЕF Контекст должен будет жить где-то в сессии что может приводить к проблемам. Из плюсов отсутствие методов типа GetCustomerByName(), и в то-же время возможность переиспользования методов со сложной логикой
-б) IEnumerable: Из минусов методы типа GetCustomerByName(), из плюсов ЕF Контекст диспозится сразу при выходе из метода.

Так кто как делает?
4 окт 18, 09:08    [21694802]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Lessyp,
Вы о чем? Где увидели цемент запросов?
Код дайте.
4 окт 18, 10:41    [21694885]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Lessyp
ужасы
выражайтесь инженерным языком.
4 окт 18, 10:43    [21694887]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 25823
Lessyp
Как-то не увидел в дискурсии как именно к этому народ собственно подходит.
Есть 2 очевидных подхода:

- Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса. Из минусов плохая читаемость, нагромождение кода, возможно дублирование логики запросов, ужасы при юнит-тестировании
- Использовать репозиторий: 2 разновидности, с IQuerable и без.
-а) IQuerable: Из минусов ЕF Контекст должен будет жить где-то в сессии что может приводить к проблемам. Из плюсов отсутствие методов типа GetCustomerByName(), и в то-же время возможность переиспользования методов со сложной логикой
-б) IEnumerable: Из минусов методы типа GetCustomerByName(), из плюсов ЕF Контекст диспозится сразу при выходе из метода.

Так кто как делает?

Не а и не б.

в) Репозиторий + спецификация и никаких GetCustomerByName()
г) CQRS

И не использую EF.
4 окт 18, 11:57    [21695007]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Lessyp
Member

Откуда:
Сообщений: 113
skyANA
Не а и не б.

в) Репозиторий + спецификация и никаких GetCustomerByName()
г) CQRS

ок, вариант в) Репозиторий + спецификация (IEnumerable)
Только куда-же GetCustomerByName() то делись? Спецификацию-же как-то задаете?
4 окт 18, 13:04    [21695110]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 25823
Lessyp
skyANA
Не а и не б.

в) Репозиторий + спецификация и никаких GetCustomerByName()
г) CQRS

ок, вариант в) Репозиторий + спецификация (IEnumerable)
Только куда-же GetCustomerByName() то делись? Спецификацию-же как-то задаете?

Спецификация - это шаблон такой.

Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации.

Погуглите "repository and specification pattern".
4 окт 18, 13:13    [21695124]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Lessyp
Member

Откуда:
Сообщений: 113
skyANA
Спецификация - это шаблон такой.

Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации.

Погуглите "repository and specification pattern".

я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value
4 окт 18, 13:26    [21695141]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 25823
Lessyp
skyANA
Спецификация - это шаблон такой.

Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации.

Погуглите "repository and specification pattern".

я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value

Да надо. И с IQuerable надо, и с CQRS. К чему Вы клонит? Никак не пойму.
4 окт 18, 13:33    [21695152]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Lessyp
Только куда-же GetCustomerByName() то делись


оформились в спецификацию, например, CustomerByNameSpecification

но не нужно путать это с фильтрацией
4 окт 18, 13:39    [21695167]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Lessyp
Member

Откуда:
Сообщений: 113
skyANA
К чему Вы клонит? Никак не пойму.


к этому:

hVostt
оформились в спецификацию, например, CustomerByNameSpecification


ок, итого имеем в наличии:

1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса
2. Использовать репозиторий:
_2.1) IQuerable
_2.2) IEnumerable
___2.2.1) Интерфейс задается методами (GetCustomerByName)
___2.2.2) Интерфейс задается спецификацией (CustomerByNameSpecification)

Пока единственный "проголосовавший" - за метод 2.2.2
4 окт 18, 14:04    [21695210]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 25823
Lessyp
ок, итого имеем в наличии:

1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса

Вы специально игнорируете упоминание CQRS?

3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса.
4 окт 18, 14:33    [21695252]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 25823
Lessyp
Пока единственный "проголосовавший" - за метод 2.2.2

А теперь смотрим на диаграмму с сайта Мартина Фаулера (repository):

Картинка с другого сайта.

Criteria (спецификация) определяется отдельно и передаётся репозиторию.
Вы реально думаете, что я единственный, кто придерживается этой схеме?
4 окт 18, 14:38    [21695257]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
hVostt
Member

Откуда:
Сообщений: 14972
skyANA,

это закрытая вендорная разработка

Lessyp,

1. не знаю, с чего вы это решили
2. нужно понять что такое репозиторий для начала, почитать у Фаулера, а то все "знают", а на деле нет ни знаний, ни понимания.
4 окт 18, 15:51    [21695414]     Ответить | Цитировать Сообщить модератору
 Re: EntityFramework и паттерн Repository  [new]
Lessyp
Member

Откуда:
Сообщений: 113
skyANA
Вы специально игнорируете упоминание CQRS?
3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса.

отнюдь. Просто в CQRS у вас все равно будут вариации на тему зацементированности или репозиториев

1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса
2. Использовать репозиторий:
_2.1) IQuerable
_2.2) IEnumerable
___2.2.1) Интерфейс задается методами (GetCustomerByName)
___2.2.2) Интерфейс задается спецификацией (CustomerByNameSpecification)
3. CQRS
5 окт 18, 12:26    [21696251]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить