|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
CalabongaВыставлять IQueryable наружу это мовитон, ибо с юнит тестами к нему не подлезешь. Честно говоря, сколько слышу по моветоновость IQueryable, так и не увидел ни одного примера с ним, где могут быть проблемы. Тестировать IQueryable совсем не сложно, вариантов несколько, от тупого List, который сидит за IQueryable, до разбора выражения, но это уже паранойя :) CalabongaА то что сборка разбита на две части, это только плюс, потому что в зависимости от ролей пользователя он получит только то, что можно. Отделять чтение от записи, это правильно, поэтому придумали CQS. Но у вас не CQS, вы просто распилили интерфейсы, без видимого профита. И запросы у вас нельзя писать отдельно. Нельзя собирать запросы из частей, например, взять спецификации безопасности и дополнить бизнес-фильтрами так, чтобы это можно было писать, сопровождать и тестировать по-отдельности. У вас нельзя. Учитывая, что в EF запись ведётся через трекинг, ваши интерфейсы WriteOnly не имеют смысла абсолютно. На EF без проекций вообще нельзя сделать адекватный CQS. Очень плохо, что вы вью-модели протащили на уровень репозитариев. Это прям кричащее нарушение всех принципов проектирования. CalabongaА что касается "идельного", ты вы же сказали, что модно и без него если есть EF... :) Да, потому что лишние прослойки может быть overengineering, который таки полезен для обучения и для практики, но может просто увеличить время разработки без видимого профита. CalabongaДумаю вам нужно ознакомиться с плюсами и минусами выставления наружу IQueryable. Не все так гладко в этом вопросе. За всю свою практику в десятках проектов от больших и малых, я никаких минусов не увидел. Это замечательный интерфейс, с которым удобно работать и который прячет подробности реализации: на IQueryable может быть как List, так и БД. Да, его можно скрыть за спецификациями, и это будет в плюс. Но плюс будет в том, что вы таким образом сможете комбинировать запросы, писать и сопровождать их отдельно, также исправлять и дорабатывать эти запросы, без необходимости ковыряться в прикладном коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 06:17 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Спасибо всем участникам, много интересного подчеркнул для себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2018, 17:58 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
не подчерпнул? Именно подчеркнул? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2018, 18:20 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Хотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification. Конструктивная критика приветствуется. Calabonga.SpecRepositoryCore ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2018, 19:02 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
CalabongaХотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification. Конструктивная критика приветствуется. Calabonga.SpecRepositoryCore а где исходники? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2018, 19:04 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
хотя не понимаю, что там может быть нового в репозитории. "на базе Specification" - это уже звучит как-то странно ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2018, 19:12 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
love_bach, В самом территории - Ничего! А вот реализации бывают разные! Это надо понимать! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2018, 03:45 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
CalabongaКонструктивная критика приветствуется.ну вы должны понимать, что из за ef паттерном интересуются меньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2018, 23:03 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Calabonga, Если исходников нет, хотя бы сгенерируйте документацию АПИ, это не сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 01:10 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
hVostt, Если подскажите как сгенерироваться - буду весьма признателен ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 05:25 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Calabonga, Нужно поставить, чтобы при сборке генерились XML из комментариев. А потом заюзать тулузу, например такую: https://dotnet.github.io/docfx/ ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 02:58 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Как-то не увидел в дискурсии как именно к этому народ собственно подходит. Есть 2 очевидных подхода: - Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса. Из минусов плохая читаемость, нагромождение кода, возможно дублирование логики запросов, ужасы при юнит-тестировании - Использовать репозиторий: 2 разновидности, с IQuerable и без. -а) IQuerable: Из минусов ЕF Контекст должен будет жить где-то в сессии что может приводить к проблемам. Из плюсов отсутствие методов типа GetCustomerByName(), и в то-же время возможность переиспользования методов со сложной логикой -б) IEnumerable: Из минусов методы типа GetCustomerByName(), из плюсов ЕF Контекст диспозится сразу при выходе из метода. Так кто как делает? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 09:08 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Lessyp, Вы о чем? Где увидели цемент запросов? Код дайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 10:41 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Lessypужасывыражайтесь инженерным языком. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 10:43 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
LessypКак-то не увидел в дискурсии как именно к этому народ собственно подходит. Есть 2 очевидных подхода: - Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса. Из минусов плохая читаемость, нагромождение кода, возможно дублирование логики запросов, ужасы при юнит-тестировании - Использовать репозиторий: 2 разновидности, с IQuerable и без. -а) IQuerable: Из минусов ЕF Контекст должен будет жить где-то в сессии что может приводить к проблемам. Из плюсов отсутствие методов типа GetCustomerByName(), и в то-же время возможность переиспользования методов со сложной логикой -б) IEnumerable: Из минусов методы типа GetCustomerByName(), из плюсов ЕF Контекст диспозится сразу при выходе из метода. Так кто как делает? Не а и не б. в) Репозиторий + спецификация и никаких GetCustomerByName() г) CQRS И не использую EF. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 11:57 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
skyANAНе а и не б. в) Репозиторий + спецификация и никаких GetCustomerByName() г) CQRS ок, вариант в) Репозиторий + спецификация (IEnumerable) Только куда-же GetCustomerByName() то делись? Спецификацию-же как-то задаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:04 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
LessypskyANAНе а и не б. в) Репозиторий + спецификация и никаких GetCustomerByName() г) CQRS ок, вариант в) Репозиторий + спецификация (IEnumerable) Только куда-же GetCustomerByName() то делись? Спецификацию-же как-то задаете? Спецификация - это шаблон такой. Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации. Погуглите "repository and specification pattern". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:13 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
skyANAСпецификация - это шаблон такой. Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации. Погуглите "repository and specification pattern". я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:26 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
LessypskyANAСпецификация - это шаблон такой. Метод GetCustomerByName не нужен, так как фильтр по имени передаётся в объекте спецификации. Погуглите "repository and specification pattern". я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value Да надо. И с IQuerable надо, и с CQRS. К чему Вы клонит? Никак не пойму. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:33 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
LessypТолько куда-же GetCustomerByName() то делись оформились в спецификацию, например, CustomerByNameSpecification но не нужно путать это с фильтрацией ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:39 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
skyANAК чему Вы клонит? Никак не пойму. к этому: hVosttоформились в спецификацию, например, CustomerByNameSpecification ок, итого имеем в наличии: 1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса 2. Использовать репозиторий: _2.1) IQuerable _2.2) IEnumerable ___2.2.1) Интерфейс задается методами (GetCustomerByName) ___2.2.2) Интерфейс задается спецификацией (CustomerByNameSpecification) Пока единственный "проголосовавший" - за метод 2.2.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 14:04 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
Lessypок, итого имеем в наличии: 1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса Вы специально игнорируете упоминание CQRS? 3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 14:33 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
LessypПока единственный "проголосовавший" - за метод 2.2.2 А теперь смотрим на диаграмму с сайта Мартина Фаулера ( repository ): Criteria (спецификация) определяется отдельно и передаётся репозиторию. Вы реально думаете, что я единственный, кто придерживается этой схеме? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 14:38 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
skyANA, это закрытая вендорная разработка Lessyp, 1. не знаю, с чего вы это решили 2. нужно понять что такое репозиторий для начала, почитать у Фаулера, а то все "знают", а на деле нет ни знаний, ни понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 15:51 |
|
EntityFramework и паттерн Repository
|
|||
---|---|---|---|
#18+
skyANAВы специально игнорируете упоминание CQRS? 3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса. отнюдь. Просто в CQRS у вас все равно будут вариации на тему зацементированности или репозиториев 1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса 2. Использовать репозиторий: _2.1) IQuerable _2.2) IEnumerable ___2.2.1) Интерфейс задается методами (GetCustomerByName) ___2.2.2) Интерфейс задается спецификацией (CustomerByNameSpecification) 3. CQRS ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 12:26 |
|
|
start [/forum/topic.php?fid=17&msg=39712845&tid=1349162]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 143ms |
0 / 0 |