|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttони просто говорят о репозитории, который является и в то же время моделью. Я плакал... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:45 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры? P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра... Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:45 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КhVosttпропущено... они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти. Это ещё фигня. Представьте, что есть сущность Resource. А есть с десяток наследников типа ArticleResource, NewsResource, CatalogResource, ProductResource, ProfileResource... И пускай тот веселый тру-архитектор уделается выдавая IEnumerable на каждую сущность. С IQueryable<T> это решается легко. OfType хорошо работает. И не лишает поведения, реализованного для для базового Resource. То же самое со спецификациями, легко наследуются и прикручиваются. В результате кода меньше во много раз, профит тот же. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:46 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУhVosttони просто говорят о репозитории, который является и в то же время моделью. Я плакал... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти. Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable. В GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование. А то, что у тебя потребители могут выкручивать базу как хотят - приводит только к анархии со всеми вытекающими. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КhVosttпропущено... они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт. вы с МСУ похоже не догоняете о чем говорит Алексей... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAпропущено... Не приведёт. вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:52 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Just UserПрошу помощи. Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает. Подскажите ,что делаю не так. Имеется база данных на SQLExpress. 1. В проект добавил edmx сформировав его на основе базы данных. 2. Описал абстрактный интерфейс 3. Написал реализацию репозитария: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
В результате выдаёт ошибку:авторНевозможно завершить операцию, поскольку класс DbContext был удален. Подскажите, что я не понимаю. Из-за выделенной в коде контроллера конструкции в момент реального запроса к данным "класс DbContext удален". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами. представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий. при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий. но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов". это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется. а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения. так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь". в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAпропущено... Объясни своими словами. представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий. при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий. но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов". это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется. а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения. так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь". в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте.И тут Остапа понесло. Чтоб тебя завтра на Java заставили писать. А если серъёзно, то ты глупости сейчас выдумываешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:17 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVostt, были озвучены 3 главные причины, почему IQueryable в репозитории это плохо: 1. Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика. 2. "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев. 3. И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Всё это: жесткие архитектурные ограничения. Нравится прибивать на каждый чих себя гвоздями? Я не против. У меня все репозитории (сервисы данных) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУУ меня все репозитории ( сервисы данных ) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно. 3 главные причины, с которыми я полностью согласен. только осталось одно но. уточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:31 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже? У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:39 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать. А если серъёзно, то ты глупости сейчас выдумываешь. нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет. однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной. выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис. однако, машина которая приезжает от клиента, может вмещать определенное количетство товаров. и в случае чего приедет еще столько раз сколько нужно. в этом случае она работает со складом, однако опять же, по накладным, считай что с сервисом. неужели непонятно? репозиторий -- это абстракция над реальным хранилищем. к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован. что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне. на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер. а то высосали проблему из пальца. и теперь решают её дедовскими методами :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:41 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУhVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже? У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно. это принципиально. читай выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:42 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ? Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC).Если бы да кабы... я описал конкретную ситуацию, которая у меня часто встречается. Постановка задачи - форме редактирования нужен объект, соответствующий таблице БД. Накой тут DTO? МСУАлексей Кпропущено... Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-) Ну давать в трёх словах, мы не торопимся :)Я тороплюсь. :-) МСУАлексей КАх вот ты о чём. :-) То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :)На каких подписчиках? Речь о логике в сервере приложений. На клиента уходит T[]. Я не сторонник LINQ-over-WCF, если ты об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:44 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра... Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу.При этом надо понимать, что мы жертвуем производительностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:46 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти. Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable.В IQueryable может быть завёрнута прикладная логика. МСУВ GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование.Это да. Вдобавок - не каждую логику можно завернуть в IQueryable/Expression. GetByID в определённых случаях единственный выход. Всему своё место. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:52 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttМСУпропущено... У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно. это принципиально. читай выше. Это не принципиально. Если тебе нечего сказать по теме и ты хочешь побеседовать на другие темы, то мне просто лень тебе объяснять очевидные вещи. Извини. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:57 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA, А как правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 17:58 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать. А если серъёзно, то ты глупости сейчас выдумываешь. нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет. однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной. выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис. однако, машина которая приезжает от клиента, может вмещать определенное количетство товаров. и в случае чего приедет еще столько раз сколько нужно. в этом случае она работает со складом, однако опять же, по накладным, считай что с сервисом. неужели непонятно? репозиторий -- это абстракция над реальным хранилищем. к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован. что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне. на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер. а то высосали проблему из пальца. и теперь решают её дедовскими методами :)Ну и какую умную мысль ты этим хочешь донести? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Just UserskyANA, А как правильно?Я не использую IQueryable вне репозитория и не использую EF. Это камрада hVostt лучше спросить Но. Варианта два: 1. Поднимать DbContext в начале запроса, убивать в конце; 2. Поднимать контекст на время работы конкртеного метода репозитория:Just Userхотя если в репозитарии пишу что-нибудь так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:21 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд. repository == data access layer Если доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:22 |
|
|
start [/forum/topic.php?fid=17&msg=38414746&tid=1349917]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 262ms |
total: | 407ms |
0 / 0 |