powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EntityFramework и паттерн Repository
25 сообщений из 121, страница 2 из 5
EntityFramework и паттерн Repository
    #39678014
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaВыставлять IQueryable наружу это мовитон, ибо с юнит тестами к нему не подлезешь.

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

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

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

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

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

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

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

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

За всю свою практику в десятках проектов от больших и малых, я никаких минусов не увидел. Это замечательный интерфейс, с которым удобно работать и который прячет подробности реализации: на IQueryable может быть как List, так и БД. Да, его можно скрыть за спецификациями, и это будет в плюс. Но плюс будет в том, что вы таким образом сможете комбинировать запросы, писать и сопровождать их отдельно, также исправлять и дорабатывать эти запросы, без необходимости ковыряться в прикладном коде.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39680704
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем участникам, много интересного подчеркнул для себя.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39680706
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не подчерпнул? Именно подчеркнул?
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39699812
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification.

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

Calabonga.SpecRepositoryCore
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39699815
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaХотелось бы показать уважаемой публике еще одну реализацию Repository. На этот раз эта песня про Repository для EntityFramework на базе Specification.

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

Calabonga.SpecRepositoryCore

а где исходники?
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39699816
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя не понимаю, что там может быть нового в репозитории.
"на базе Specification" - это уже звучит как-то странно
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39699882
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
love_bach,

В самом территории - Ничего! А вот реализации бывают разные! Это надо понимать! :)
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39700006
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaКонструктивная критика приветствуется.ну вы должны понимать, что из за ef паттерном интересуются меньше.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39700683
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

Если исходников нет, хотя бы сгенерируйте документацию АПИ, это не сложно.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39700697
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,


Если подскажите как сгенерироваться - буду весьма признателен
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39704642
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

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

А потом заюзать тулузу, например такую: https://dotnet.github.io/docfx/
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712790
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то не увидел в дискурсии как именно к этому народ собственно подходит.
Есть 2 очевидных подхода:

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

Так кто как делает?
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712843
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,
Вы о чем? Где увидели цемент запросов?
Код дайте.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712845
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypужасывыражайтесь инженерным языком.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712899
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypКак-то не увидел в дискурсии как именно к этому народ собственно подходит.
Есть 2 очевидных подхода:

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

Так кто как делает?
Не а и не б.

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

И не использую EF.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712955
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНе а и не б.

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

ок, вариант в) Репозиторий + спецификация (IEnumerable)
Только куда-же GetCustomerByName() то делись? Спецификацию-же как-то задаете?
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712963
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypskyANAНе а и не б.

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

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

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

Погуглите "repository and specification pattern".
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712967
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСпецификация - это шаблон такой.

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

Погуглите "repository and specification pattern".
я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712976
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypskyANAСпецификация - это шаблон такой.

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

Погуглите "repository and specification pattern".
я в курсе про этот паттерн, потому и спрашиваю, ведь при определении спецификации вам все равно надо задавать условие CustomerName == value
Да надо. И с IQuerable надо, и с CQRS. К чему Вы клонит? Никак не пойму.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39712984
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypТолько куда-же GetCustomerByName() то делись

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

но не нужно путать это с фильтрацией
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39713000
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAК чему Вы клонит? Никак не пойму.

к этому:

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

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

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

Пока единственный "проголосовавший" - за метод 2.2.2
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39713025
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypок, итого имеем в наличии:

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

3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39713026
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypПока единственный "проголосовавший" - за метод 2.2.2
А теперь смотрим на диаграмму с сайта Мартина Фаулера ( repository ):



Criteria (спецификация) определяется отдельно и передаётся репозиторию.
Вы реально думаете, что я единственный, кто придерживается этой схеме?
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39713087
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

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

Lessyp,

1. не знаю, с чего вы это решили
2. нужно понять что такое репозиторий для начала, почитать у Фаулера, а то все "знают", а на деле нет ни знаний, ни понимания.
...
Рейтинг: 0 / 0
EntityFramework и паттерн Repository
    #39713499
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВы специально игнорируете упоминание CQRS?
3. Не использовать репозиторий, а использовать CQRS и никакого цементирования в методах сервисного класса.
отнюдь. Просто в CQRS у вас все равно будут вариации на тему зацементированности или репозиториев

1. Не использовать репозиторий: все ЕF запросы зацементированы в методах сервисного класса
2. Использовать репозиторий:
_2.1) IQuerable
_2.2) IEnumerable
___2.2.1) Интерфейс задается методами (GetCustomerByName)
___2.2.2) Интерфейс задается спецификацией (CustomerByNameSpecification)
3. CQRS
...
Рейтинг: 0 / 0
25 сообщений из 121, страница 2 из 5
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EntityFramework и паттерн Repository
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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