|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Прошу помощи. Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает. Подскажите ,что делаю не так. Имеется база данных на SQLExpress. 1. В проект добавил edmx сформировав его на основе базы данных. 2. Описал абстрактный интерфейс Код: c# 1. 2. 3. 4. 5. 6. 7.
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.
в коде контроллера Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
В результате выдаёт ошибку: авторНевозможно завершить операцию, поскольку класс DbContext был удален. хотя если в репозитарии пишу что-нибудь так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Отлавливает ошибку и возвращает набор данных "ФиктивныеГруппы", а далее без проблем. Подскажите, что я не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 12:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>. 2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат. 3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 12:55 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУ1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>. 2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат. 3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать. слушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData? есть весовые причины готовить только IEnumerable/IList? ну кроме той, чтобы оставить возможность подсовывать в качестве источника данных, провайдер которого даже не собирается поддерживать LINQ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVostt, смотри тут: Проблемы при использовании шаблона Repository . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttслушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData? OData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием. hVosttесть весовые причины готовить только IEnumerable/IList Скиана опередил. У меня тоже этот рецептик пылится. Учи, вникай. http://codearticles.ru/articles/2357 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository . Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел. Спецификации по-любому нужны. Технические поля сущностей ORM скрываются моделью DTO (можно вообще работать с интерфейсами, если уж ORM на столько уродский). UnitOfWork вообще отдельная песня, какого ляда он делает в объекте репозитория? Нафиг его оттуда и проблема решена. В общем проблем не вижу. Пока что. Или я что-то проглядел? Что может пойти не так при использовании IQueryable<T>? Чистый интерфейс без возможности как-то модифицировать репу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУ, пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта но отказываться от лейзи пропертей в пользу рисования отдельного DTO над DTO я бы не стал, это не решение проблемы, это геморрой на задницу. спецификации никто не отменял, Include никто не отменял, все это прекрасно ложиться на паттер "Корень агрегации". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:55 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием. как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 13:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository . Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел. Если не увидел - это твои и только твои проблемы. Пиши код хоть раком, нам-то что с того. Ты попросил озвучить причины, тебе озвучили. hVosttМСУ, пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта Речь о IQueryable, сосредоточься. В DTO не нужны никакие ленивые свойства, DTO это объект для трансфера и только. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:24 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttМСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием. как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит? В OData IQueryable оперирует контроллер и только он. Контроллер - это не репозиторий. У тебя как всегда смешалось в кучу всё, кони, люди, сено. Еще раз, речь не о OData, в котором есть своя специфика - работа с IQueryable. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:27 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:53 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository . Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.Как поарботаешь в команде из 10+ человек, так поймёшь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе! Не понял, а логика тут каким боком? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать. Шаблон Specification, изучаем. Скиана ссылку дал. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:00 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе! Не понял, а логика тут каким боком? ) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если работать с WCF, в этом примере тут проблемы точно будут. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:04 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Не понял, а логика тут каким боком? ) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если работать с WCF, в этом примере тут проблемы точно будут. Это не DTO. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Кто нибудь может пояснить в моём коде, что не так и как это можно исправить. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:08 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать. Шаблон Specification, изучаем. Скиана ссылку дал.Его возможности ограничены. Есть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:11 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если работать с WCF, в этом примере тут проблемы точно будут. Это не DTO.Да. Это повод создать DTO на пустом месте, о чём я и хотел сказать. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЕго возможности ограничены. Чем? Алексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно. Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:13 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-) Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЕго возможности ограничены. Чем?Функционалом. :-) МСУАлексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно. Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable.IQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:16 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-) Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то?Проблема в самой необходимости слоя DTO, когда без него можно обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:19 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КФункционалом. :-) Каким? Так... Попахивает топиком ненависти к ASP.NET MVC Алексей КIQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать? Так ты с этим IQueryable + "подставляемые выражения" можешь точно так же работать в шаблоне спецификации. В чем проблема? Накохер (с) мне таскаться с этим IQueryable по всему полю? Сеять потенциальные ошибки, плодить потенциальные грабли и пугать местное население? В топку :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:19 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КПроблема в самой необходимости слоя DTO, когда без него можно обойтись. Не встречал таких ситуаций, даже в самых тривиальных задачах. Добавилось свойство в модель для каких-то своих нужд, зачем мне это поле протаскивать в SOA, нагружая трафик и пугая пользователей веб сервиса? А если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее. Не нужно мешать логику с трансфером, сельчанин :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУТак... Попахивает топиком ненависти к ASP.NET MVC Это был способ привлечь читателей в топик. Правильное название - залог успеха. МСУАлексей КIQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать? Так ты с этим IQueryable + "подставляемые выражения" можешь точно так же работать в шаблоне спецификации. В чем проблема? Накохер (с) мне таскаться с этим IQueryable по всему полю? Сеять потенциальные ошибки, плодить потенциальные грабли и пугать местное население? В топку :)Накойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:23 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНакойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable? Это проблема (Repository, как фабрика запросов). Как будешь её решать? Допиливать код в 100500 местах? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:26 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.Как поарботаешь в команде из 10+ человек, так поймёшь. я понял. речь идёт о необъяснимых вещах. вы так не переживайте, я видел достаточно серьезные проекты, над которыми работают овер 10 человек. так там не то, что не скрывают IQueryable<T>, так вообще фигачат SQL-ники прямо в обработчиках кнопок, фигарят классы для маппинга ОРМ прямо что называется "на месте" и вообще ничуть не запариваются. так что все эти 1000+ команды -- по крайне мере в наших реалиях вот совершенно не аргумент, говнокодят без зазрения совести, только в путь... давайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение. где эта нерешаемая трабла, связанная с применением IQueryable<T>? серьезно же спрашиваю, может я чего-то незнаю. и только без вот этих вот "вырастешь — узнаешь" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КПроблема в самой необходимости слоя DTO, когда без него можно обойтись. Не встречал таких ситуаций, даже в самых тривиальных задачах. Добавилось свойство в модель для каких-то своих нужд, зачем мне это поле протаскивать в SOA, нагружая трафик и пугая пользователей веб сервиса?Потому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах? МСУА если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее.Там где это не надо - этого делать не надо. :-) МСУНе нужно мешать логику с трансфером, сельчанин :)Ну уж как умеем, если что не так - извиняйте. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУплодить потенциальные грабли и пугать местное население блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая??? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttтак что все эти 1000+ команды -- по крайне мере в наших реалиях вот совершенно не аргумент, говнокодят без зазрения совести, только в путь... Мы тут паттерны обсуждаем, а не гавнокод. В чём смысл твоего выступления тут? hVosttдавайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение. В ссылке всё описано. Если до сих пор не понял эту проблему, то выпей яду. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttМСУплодить потенциальные грабли и пугать местное население блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая??? Ты реально такой тугой? В первой же главе "Проблема: Repository, как фабрика запросов" и 2 варианта решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:33 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КНакойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable? Это проблема (Repository, как фабрика запросов). Как будешь её решать? Допиливать код в 100500 местах?Да нет никаких проблем. Все проблемы в головах авторов паттерна "репозитарий", которые вдруг решили, что можно вынести логику работы с данными отдельно от остальной логики. Это не всегда возможно, поскольку может привести к "N+1". Накой мне проблемы с производительностью? У меня есть классы сущностей (содержат данные), классы сервисов (содержат логику) и выражения (содержат выражения :-), с целью избежать "N+1" и иметь возможность повторного использования). Сервер приложений, по сути, один большой репозитарий... А нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КПотому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах? Добавление поля в БД вовсе не означает добавление его в веб сервис. Алексей КМСУА если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее.Там где это не надо - этого делать не надо. :-) Это поле (где не надо) всё-равно будет протаскивать в wsdl подписчикам. Их кодогенерированные классы будут содержать лишние свойства. Представляешь ситуацию, если SOA подписчикам нужно только Id и Title, а ты им еще десяток свойств сливаешь? :) Алексей КНу уж как умеем, если что не так - извиняйте. :-) Наезд на DTO считаю дерзким и необоснованным! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КДа нет никаких проблем. Все проблемы в головах авторов паттерна "репозитарий", которые вдруг решили, что можно вынести логику работы с данными отдельно от остальной логики. Это не всегда возможно, поскольку может привести к "N+1". Накой мне проблемы с производительностью? Так, еще раз. Какой N + 1, у нас же есть Specification? Ты сказал, что у него возможности ограничены. Но в чем выражено ограничение не признаешься :) Во-вторых, можно Func<> передавать входным параметром, если приспичит. Алексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться. Ты так и не ответил на вопрос про 100500 исправлений в коде... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КПотому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах? Добавление поля в БД вовсе не означает добавление его в веб сервис. Алексей Кпропущено... Там где это не надо - этого делать не надо. :-) Это поле (где не надо) всё-равно будет протаскивать в wsdl подписчикам. Их кодогенерированные классы будут содержать лишние свойства. Представляешь ситуацию, если SOA подписчикам нужно только Id и Title, а ты им еще десяток свойств сливаешь? :)Я говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто. МСУАлексей КНу уж как умеем, если что не так - извиняйте. :-) Наезд на DTO считаю дерзким и необоснованным! :)Зря. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:42 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУhVosttпропущено... блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая??? Ты реально такой тугой? В первой же главе "Проблема: Repository, как фабрика запросов" и 2 варианта решения. делаем набор спецификаций. получаем из репы IQueryable<T> по указанной спецификации. и не надо плодить 100500 методов. зато можно пейджинг повесить без видимых проблем. или отдать в OData. и вообще. какие проблемы-то? ниче не понял. яду выпить не предлагать. скажи лучше что сам не знаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:45 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУТы сказал, что у него возможности ограничены. Но в чем выражено ограничение не признаешься :)Максимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно. МСУМСУВо-вторых, можно Func<> передавать входным параметром, если приспичит.И как мы будем подставлять IL, живущий в Func<>, в LINQ Expression? МСУАлексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться. Ты так и не ответил на вопрос про 100500 исправлений в коде... Потому что при использовании подставляемых выражений с повторным использованием всё в порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться. Проблема: Repository, как фабрика запросовОбъект IQueryable в .NET дает больше возможностей сделать ошибки в проектировании. Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:55 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttделаем набор спецификаций. получаем из репы IQueryable<T> по указанной спецификации. и не надо плодить 100500 методов. зато можно пейджинг повесить без видимых проблем. или отдать в OData. и вообще. какие проблемы-то? ниче не понял. яду выпить не предлагать. скажи лучше что сам не знаешь. Какой набор спецификаций, зачем, куда? Какие 100500 методов? Ты о чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:58 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться. Проблема: Repository, как фабрика запросовОбъект IQueryable в .NET дает больше возможностей сделать ошибки в проектировании. Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы.Оно даёт не больше возможностей для ошибки, чем всё остальное. Автор статьи лукавит. Вероятно, он основывается на своём неудачном опыте. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:58 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 15:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой? Меня в параграфе «Проблема: Repository, как фабрика запросов» устраивает: Решение №2 Можно использовать шаблон Specification вместе c шаблоном Query Object. Второй шаблон уже реализован в .NET с помощью дерева запросов на LINQ. Только возвращать можно не IEnumerable<T>, а IQueryable<T> — и я не вижу к каким проблемам это может привести. Зато явный профит вижу. Можно сделать Take и Skip, можно сделать OfType, можно сделать выборку только нужных полей (например, если не хочется для отдельных случаев вытаскивать большой блоб) или дополнительно уточнить запрос динамически ( в тех случаях, когда спецификации уже не подходят, например OData, или кастомный фильтр/сортировщик на гриде ). Я считаю, что IQueryable<T> — разработан совсем не для того, чтобы его похоронили где-то на задворках репозитория. Все, что делается поверх, это очень грубое повторение всё той же работы, которая уже проделана за вас. Какие-то специфичные методы для очень конкретных операций над данными, типо бизнес-логика -- очень хорошо, ведь надо свести к минимуму возможность прикладных разработчиков прострелить себе ногу. Но возможности IQueryable<T> в этом отношении явно переоценены. Я не вижу каких-то явных нерешаемых проблем. Больше вижу религиозно-фанатичный налет в мышлении, раз вместо объяснений летят какие-то непонятные пасы с указанием на бутылку с ядом или "вырастешь узнаешь". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:02 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... пропущено... Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы.Оно даёт не больше возможностей для ошибки, чем всё остальное. Автор статьи лукавит. Вероятно, он основывается на своём неудачном опыте. :-)То есть возможность дублирования логики запросов - это не возможность? Ещё раз: как вы эту НЕВОЗМОЖНОСТЬ обеспечиваете? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто. Ну хорошо, выложилось всё. Но причем тут логика (модель, code behind валидация) и презентационный слой (UI, валидация)? Алексей КМаксимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно. Почему же, ты точно так же можешь конструировать весь отложенный запрос или несколько. Алексей КИ как мы будем подставлять IL, живущий в Func<>, в LINQ Expression? Какой IL? Я про Func<A, B> predicate, который можно передавать в аргументы. Алексей КПотому что при использовании подставляемых выражений с повторным использованием всё в порядке. Какие в результирущем IQueryable "подставляемые выражения"? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?Так же как и в остальных случаях. Это могла быть и недостающая вьюха в БД, и всё что угодно, в зависимости от имеющейся архитектуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:04 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Неправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?Так же как и в остальных случаях. Это могла быть и недостающая вьюха в БД, и всё что угодно, в зависимости от имеющейся архитектуры.То есть никак не обязываете? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:08 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttТолько возвращать можно не IEnumerable<T>, а IQueryable<T> — и я не вижу к каким проблемам это может привести. Тебе уже 10 раз озвучили эти проблемы. Яд на столе. hVosttЗато явный профит вижу. Можно сделать Take и Skip, можно сделать OfType, можно сделать выборку только нужных полей (например, если не хочется для отдельных случаев вытаскивать большой блоб) или дополнительно уточнить запрос динамически ( в тех случаях, когда спецификации уже не подходят, например OData, или кастомный фильтр/сортировщик на гриде ). Это всё делается в реализации метода репозитория. Репозиторий возвращает только то, что нужно потребителю. hVosttЯ считаю, что IQueryable<T> — разработан совсем не для того, чтобы его похоронили где-то на задворках репозитория. Никто его хоронить не будет, просто нужно это использовать в правильных местах. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУНеправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен. спецификация. упаковываются такие случае в спецификацию. IQueryable<T> не для дофильтрации. а, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУТебе уже 10 раз озвучили эти проблемы. Яд на столе. плохо озвучили. на счет яда понял. отмазка на случаи "я не знаю, или лесом" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:10 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто. Ну хорошо, выложилось всё. Но причем тут логика (модель, code behind валидация) и презентационный слой (UI, валидация)?Там трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД. МСУАлексей КМаксимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно. Почему же, ты точно так же можешь конструировать весь отложенный запрос или несколько.Не точно так же. Гибкости подставляемых выражений там не добиться. МСУАлексей КИ как мы будем подставлять IL, живущий в Func<>, в LINQ Expression? Какой IL? Я про Func<A, B> predicate, который можно передавать в аргументы.Func<A, B> vs Expression<Func<A, B>> Есть разница? :-) МСУАлексей КПотому что при использовании подставляемых выражений с повторным использованием всё в порядке. Какие в результирущем IQueryable "подставляемые выражения"? IQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttIQueryable<T> не для дофильтрации Ты сам себе противоречишь. Вот тут ты сказал: hVosttЗато явный профит вижу. Можно сделать Take и Skip Это таки дофильтрация. Или будешь спорить? hVosttа, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться. Всё это сделает репозиторий, ты только ему передай ему параметры. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttЯ считаю, что IQueryable<T>...Считай на здоровье. Статья призвана обратить внимание на возможные проблемы их применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД. То есть у тебя все запросы вида "SELECT * FROM"? Алексей КНе точно так же. Гибкости подставляемых выражений там не добиться. В чем выражена эта гибкость? ) Алексей КFunc<A, B> vs Expression<Func<A, B>> Есть разница? :-) Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :) Алексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Неправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен.Я отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте. Нельзя этого делать, тебе ж объяснили почему. Если потребуется усечь выборку (новое требование) при помощи [Where IsDeleted = False], тебе придется это делать в 100500 местах прикладного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:18 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД. То есть у тебя все запросы вида "SELECT * FROM"? В форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ? МСУАлексей КНе точно так же. Гибкости подставляемых выражений там не добиться. В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-) МСУАлексей КFunc<A, B> vs Expression<Func<A, B>> Есть разница? :-) Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :)У меня телепатор в ремонте. МСУАлексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор.Потребители разные бывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
О чем спор? Что возвращать IEnumerable или IQueryable из репозитория? Конечно первое. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте. Нельзя этого делать, тебе ж объяснили почему. Если потребуется усечь выборку (новое требование) при помощи [Where IsDeleted = False], тебе придется это делать в 100500 местах прикладного кода.Ах вот ты о чём. :-) Код: 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.
Обрати внимание, IsActive описано в одном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
from d in D1 опечатка ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:27 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
И кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУА через выражения это выглядит ещё красивее Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:31 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:33 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL ++ ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:34 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:35 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры? P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры? P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Репозиторий, что является и в то же время моделью. Жжёшь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ? Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC). Алексей КМСУпропущено... В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-) Ну давать в трёх словах, мы не торопимся :) Алексей КАх вот ты о чём. :-) То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:43 |
|
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 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:26 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд. repository == data access layerRepositoryA Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers. Алексей КЕсли доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен.Если до конца понимать суть шаблона, то откуда какая-то логика N+1? Если доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. То есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:39 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Если кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-) skyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Алексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий Алексей КskyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5. Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Вроде тоже правильно: авторConceptually, a Repository LINQ DbContext encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. skyANAАлексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий Алексей Кпропущено... Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5. Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли.Я уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:24 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что? Репозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены. То что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA,автор на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Вы что работу поменяли? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что?И всё. :-) skyANAРепозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены.В DbContext такой API присутствует. skyANAТо что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию. Не понял, где я чего опустил. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 05:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. Ужос... А у меня нечерезжопное нормальное решение: репозиторий как IDisposable, где в методе Dispose честно прибивается датаконтекст или иной диспосабельный ресурс. Всё в рамках классики без соплей и гадостей. Алексей КDbContext == Repository В каком-то приближени, да. Но не совсем, т.к. датаконтекст - это реляционное отображение данных БД (ORM), а репозиторий - посредник между уровнями области определения и распределения данных (domain and data mapping layers), используя интерфейс, схожий с коллекциями для доступа к объектам области определения. Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 09:27 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Где-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУСлушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?Алексей КВ DbContext такой API присутствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAГде-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле. мда.., как быстро летит время ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:44 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?А если завтра это будет не нужно? А оно медленно работает уже сегодня. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 13:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Зануды... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 13:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КА если завтра это будет не нужно? Так я же уже писал про непредсказуемость бизнеса и про то, что ты изначально прибиваешь свою архитектуру жирными гвоздями к доске. Не понимаю смысла в этом. Да еще и какую-то жесть с "ThreadStatic + счётчик ссылок" реализовывать. Алексей КА оно медленно работает уже сегодня. Ты о чем? Что в репозитории работает медленно? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 14:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КА оно медленно работает уже сегодня. Ты о чем? Что в репозитории работает медленно? :)N+1 Мы ходим по кругу. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:06 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Ты о чем? Что в репозитории работает медленно? :)N+1 Мы ходим по кругу. :-)То есть у N+1 у вас уже сегодня работает? Или у кого оно работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:19 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Вообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:47 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления.Спасибо КЭП. А иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем. Также полезно внимательно читать, что пишут:Проблемы при использовании шаблона RepositoryКак любой другой шаблон проектирования, Repository имеет множество интерпретаций и реализаций. Вообще, когда речь идет о проектировании, то сложно отделить абсолютно правильное решение от полностью неправильного. Обычно говорят, что всё зависит от ситуации. С другой стороны, в блогах и статьях попадаются решения, в которых авторы нарушают принципы проектирования или предлагают реализации с явными проблемами. Я собрал такие способы использования шаблона Repository, для того чтобы обратить внимание на возможные проблемы их применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAА иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-) Если по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:11 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КГлавное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-) Мнение большинства: биться о бетонную стену головой опасно. Мнение Васи Кожевникова (сисадмин в головной компании РЖД): всё это хрень, биться головой о бетонную стену можно и нужно - прояснение ума и осознание истинного бытия. Алексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAА иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное. Но реальность не ограничивается лишь Вашим случаем. Алексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно.Ну то есть архитектуру конкретной реализации. И что конкретно Вы хотите обсудить? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:47 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Примкну к Алексей К 1) Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика. Web, WCF - per call; Winforms, WPF - время жизни окна. Что в этом плохого? 2) "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев. UI - BL (сервисы) - DAL (репозитории). В сервисах работать с IQueryable, наружу отдавать IEnumerable. Кручу только я сам как хочу. Что в этом плохого? 3) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Вот этого совсем не понял. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное. Но реальность не ограничивается лишь Вашим случаем.А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-) skyANAАлексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно.Ну то есть архитектуру конкретной реализации. И что конкретно Вы хотите обсудить?Теперь не знаю. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:51 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP1983Winforms, WPF - время жизни окна.Я бы тут даже сократил до времени вызова ButtonClick. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:53 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога.А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов? Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КSerP1983Winforms, WPF - время жизни окна.Я бы тут даже сократил до времени вызова ButtonClick. Зависит от ситуации. Если взять супер-пупер асинхронный грид у девэкпресса (позволяет при скроле подгружать данные), то для него нужен датаконтекст на все время жизни этого грида, что, скорее всего, равно времени жизни формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное. Но реальность не ограничивается лишь Вашим случаем.А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-)Покажите-ка, где конкретно "любители репозиториев" утверждали, что их решение универсальное. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Вот этого совсем не понял. Код: c# 1. 2. 3. 4.
И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога.А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов? Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте? 14913302 Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:04 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP1983Алексей Кпропущено... Я бы тут даже сократил до времени вызова ButtonClick. Зависит от ситуации. Если взять супер-пупер асинхронный грид у девэкпресса (позволяет при скроле подгружать данные), то для него нужен датаконтекст на все время жизни этого грида, что, скорее всего, равно времени жизни формы.Ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:04 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANASerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Вот этого совсем не понял. Код: c# 1. 2. 3. 4.
И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>? Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:06 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP1983skyANAпропущено... И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>? Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable. ну или я думаю совсем не туда. Все равно, откуда "зависимость от MSSQL + EF"? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:08 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-)Покажите-ка, где конкретно "любители репозиториев" утверждали, что их решение универсальное. 14911778 Первый же ответ в этом топике. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
контекст это не только механизм который гребет данные, но и кеши двух уровней и механизм единицы работы.. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 17:10 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP1983skyANAпропущено... И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>? Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable.Не "зависимость от MSSQL + EF", а необходимость писать реализацию IQueryProvider там где это не надо: 14913484 . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 19:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов? Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте? 14913302 Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой.На практике почему-то такого не происходит А если торчит IQueryable, значит можно его использовать как IQueryable по полной, разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 19:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Вот этого совсем не понял. Код: c# 1. 2. 3. 4.
Ну это жесть какая-то. У одних методов репозтория IQueryable - отложенный запрос, который после транслируется в SQL - это тонкая специфика и понимание, с какой именно БД работаем. Иначе будет ошибка и запрос не сможет транслироваться. У других методов IQueryable не заточен под конкретную БД и представляет собой клиентскую коллекцию. Каша. Во что ретранслируется этот запрос и что он мне вернет? Код: c# 1.
Бред же. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 19:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУ, Форум— это дуракаваляние… Разговаривают, разговаривают… Контрреволюция одна. (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 21:20 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... 14913302 Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой.На практике почему-то такого не происходит А если торчит IQueryable, значит можно его использовать как IQueryable по полной, разве нет?"На практике почему-то такого не происходит" (ц). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 08:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУНу это жесть какая-то. У одних методов репозтория IQueryable - отложенный запрос, который после транслируется в SQL - это тонкая специфика и понимание, с какой именно БД работаем. Иначе будет ошибка и запрос не сможет транслироваться. У других методов IQueryable не заточен под конкретную БД и представляет собой клиентскую коллекцию. Каша."Разруха, она в головах." (ц) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 08:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 08:44 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
2 skyANA и МСУ Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу. Предлагаю рассмотреть 2 случая: 1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource, EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable. 2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable. Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 09:17 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей К"Разруха, она в головах." (ц) ... которые используют IQueryable методы в репозиториях :) Алексей КМСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться. Какое еще окружение? Или ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция. Может тебе посмотреть на OData? SerP19832 skyANA и МСУ Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу. Предлагаю рассмотреть 2 случая: 1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource, EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable. 2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable. Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable? 1. Вся беда, что ты под какие-то там компоненты пытаешься рихтовать архитектуру. Это не айс. 2. Про OData уже писал, это отдельный специфический продукт, который заточен под IQueryable. Более того, OData - это не репозиторий, там ты сам контроллер ApiController обязываешь играть по правилам IQueryable. Вообщем, это отдельная тема. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 09:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей К"Разруха, она в головах." (ц) ... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться? Тот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable. И если типа это аналог представления, то сколько у вас таких "представлений"? N + 1? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP19832 skyANA и МСУ Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу. Предлагаю рассмотреть 2 случая: 1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource, EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable. 2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable. Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?Встречный вопрос: Вы OData пользовались? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:18 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться?Если Вы не находите применение такому подходу, наверное, Вам это не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:20 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
А до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAА до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?Если это вопрос мне, то 14914067 . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... ... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-) Посмотри на название темы. Что тогда ты тут делаешь? :) Алексей КМСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса. В случае репозитория этот функционал излишен, даже вреден. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:30 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Кстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... У меня вообще нет такого понятия, как репозитарий. :-) Посмотри на название темы. Что тогда ты тут делаешь? :)Хочешь меня прогнать? МСУАлексей Кпропущено... IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса. В случае репозитория этот функционал излишен, даже вреден.В случае IQueryable репозитарий излишен, даже вреден. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
2skyANA В проектах - нет. Самому потыкаться - да. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
О, тролололинг пошёл. А аргументы будут? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25 14914067 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAТот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.Ну могу дать другой пример. Не для слабонервных Код: 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:42 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КХочешь меня прогнать? Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :) Алексей КВ случае IQueryable репозитарий излишен, даже вреден. :-) Отлично. То есть репозиторий есть зло? Приехали... Алексей КМСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25 14914067 Подожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:43 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНу могу дать другой пример. Не для слабонервных И где тут IQueryable для клиентов? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:44 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? ) А разве есть что-то стандартное? (bltoolkit не предлагать) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:47 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУТо есть у тебя все запросы вида "SELECT * FROM"? В форму редактирования уходит объект, сгенерированный по таблице из базы. Алексей Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Божественно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КХочешь меня прогнать? Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)Спасибо за заботу, приятно. :-) МСУАлексей КВ случае IQueryable репозитарий излишен, даже вреден. :-) Отлично. То есть репозиторий есть зло? Приехали...Я бы не был столь категоричен. Ограничусь тем, что в текущих проектах мне он не нужен. :-) МСУПодожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )Никакую. :-) Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP1983МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? ) А разве есть что-то стандартное? (bltoolkit не предлагать) Причем тут ORM? Речь о байдингах. Например, вот OData New IQueryable Support for Http Services in WCF Код: c# 1. 2. 3. 4. 5. 6.
Код: c# 1.
Но у Алексея какое-то своё курево. Либо он нас жестко троллит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНикакую. :-) Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений. Ты ж моё солнце, а как же N+1 в твоём SOA сервисе? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:52 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
2МСУ Я не про orm, я про это Linq over WCF ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:54 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КНикакую. :-) Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений. Ты ж моё солнце, а как же N+1 в твоём SOA сервисе? Ну вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя? Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:57 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя? Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:00 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
SerP19832МСУ Я не про orm, я про это Linq over WCF Ну я понял, BLT Linq провайдер идет же в комплекте с этой ORM. Ну ладно, не суть. Алексей КНу вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил. Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КНу вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил. Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :)Ну у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-) А в аспнете да, там есть соблазн запихать всё в контроллер. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :)Ну у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-)Это я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:20 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНу у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-) А в аспнете да, там есть соблазн запихать всё в контроллер. :-) Милок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :) Лично считаю утолщать эти классы - зло. Нужна дополнительная абстракция и называется она - репозиторий. Отдельная сборка, твой ServiceContract ничего не должен знать о БД. Алексей КЭто я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием. Нужны, Леша, нужны. Не спорь, а верь мне на слово. Не зря я писал про ограждение неофитов от тебя :) Не учи детей плохому! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:31 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЭто я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием. Нужны, Леша, нужны. Не спорь, а верь мне на слово. Не зря я писал про ограждение неофитов от тебя :)Бытует мнение, что недостаточная ответственность у класса не меньшее зло, чем наличие лишней ответственности. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:51 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУМилок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :)Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:54 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНакой мне слой методов, содержащих только делегирование? Зачем же только делегирование? В контроллере ты можешь маппить dto и модели, писать условия в разрезе секурности, что-то анализировать и т.д. А потом вызывать честный репозиторий, передавать подготовленные аргументы, принимать результат, маппить его на dto, формировать текст и код ошибки, если она есть, и возвращать требуемый объект. Как видишь, контроллер (метод сервис контракта) это не тупо делегирование. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:57 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУМилок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :)Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View. Ты заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления. И тут тоже самое, по сути. Твой метод подготавливает ответ с конкретным DTO. На лицо аналогия. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:00 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КНакой мне слой методов, содержащих только делегирование? Зачем же только делегирование? В контроллере ты можешь маппить dto и модели, писать условия в разрезе секурности, что-то анализировать и т.д. А потом вызывать честный репозиторий, передавать подготовленные аргументы, принимать результат, маппить его на dto, формировать текст и код ошибки, если она есть, и возвращать требуемый объект. Как видишь, контроллер (метод сервис контракта) это не тупо делегирование.Ну всё правильно, в аспнет - да. Но в WCF? Я привёл выше реальный пример. Там будет только делегирование + атрибуты для безопасности. Обработка ошибок у меня централизованная, вынесена в ServiceBehavior. Мне контракт сервисов в интерфейсы лень выносить, а ты говоришь ещё добавить слой репозитариев... Зачем мне такое счастье? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View. Ты заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления.Ну он там может знать, а может и не знать. Например, в зависимости от каких-то условий вернуть разные вью. Но не буду спорить, я в аспнете пока не силён. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:06 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУМы сейчас говорим об внутреннем устройстве информационной системы. Оно должно максимально удобно поддерживаться и модифицироваться. Тут лишние слои только мешают. Это не интеграция со смежной системой, которая должна гарантировать определённый контракт. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:10 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КНу всё правильно, в аспнет - да. Но в WCF? Да какая разница? :) Что метод контроллера, что метод webapi контроллера, что метод odata контроллера, что operation contract метод, что метод веб сервиса. Никакой принципиальной разницы. Все эти методы должны честно общаться с middle слоем, который и представляет собой репозиторий. Вот о чем тут спич трется. Алексей КЯ привёл выше реальный пример. Там будет только делегирование + атрибуты для безопасности. Обработка ошибок у меня централизованная, вынесена в ServiceBehavior. Ну для каких-то элементарных методов может и будет делегирование, но это как правило редкость. Во многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch. Алексей КЗачем мне такое счастье? Ты про свой лапшекод в "обработчиках", который прибит к конкретной БД? :) http://msdn.microsoft.com/ru-ru/library/gg416511(v=vs.98).aspx Добавление репозитория При работе с платформой MVC не рекомендуется включать модель сущность-данные (EDM) или код какой-либо другой платформы доступа к данным в контроллер. Вместо этого нужно использовать шаблон репозитория. Репозиторий располагается между приложением и хранилищем данных. Репозиторий разделяет бизнес-логику и взаимодействие с исходной базой данных и объединяет все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных. Репозиторий возвращает объекты из модели домена. В простых моделях, таких как та, которая используется в этом пошаговом руководстве, объекты, возвращаемые из EDM, LINQ to SQL и других моделей данных, квалифицируются как объекты домена. В более сложных приложениях может потребоваться слой сопоставления. Слой сопоставления не всегда оказывается неэффективным. Поставщики LINQ могут создавать эффективные запросы серверному хранилищу данных (то есть они могут отправлять запросы с использованием минимального числа промежуточных объектов). Для того чтобы использовать репозиторий, не требуются глубокие знания EDM, LINQ to SQL или каких-либо других моделей данных, с которыми работает пользователь. (Хотя LINQ не описывается в данном пошаговом руководстве, использование LINQ в качестве абстракции запросов означает, что механизм хранения данных можно скрыть. Благодаря этому можно, например, использовать SQL Server для производства, а LINQ to Objects в коллекциях в оперативной памяти — для тестирования.) Чтобы протестировать методы действий в контроллере, осуществляющие прямой доступ к модели EDM, необходимо подключение к базе данных, поскольку методы действий зависят от EDM (которая, в свою очередь, зависит от базы данных). В следующем примере кода показан контроллер MVC, использующий сущность "Контакт" модели EDM напрямую. Кроме того, из этого примера становится понятно, почему смешение вызовов базы данных в методах действий усложняет тестирование метода действия. Например, модульные тесты, изменяющие и удаляющие данные, изменяют состояние базы данных. Поэтому для каждого прохождения модульного теста требуется чистая база данных. Кроме того, вызовы базы данных расходуют большое количество ресурсов, а модульные тесты — незначительное количество ресурсов, поэтому их можно часто выполнять в ходе разработки приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУТы заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления.Ну он там может знать, а может и не знать. Например, в зависимости от каких-то условий вернуть разные вью. Но не буду спорить, я в аспнете пока не силён. :-) Он не может знать о представлении. Без ну и но :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей Кв зависимости от каких-то условий вернуть разные вью. Вернуть вью - это не знать он них :) Он может вернуть "название вью", а доступ к представлению запрещен по сути даже самого паттерна MVC. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:17 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУВо многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch.Повторюсь, в WCF есть возможность централизовать обработку ошибок, написав соответствующий ServiceBehavior. В аспнете есть аналогичные возможности. Я же дал реальный пример, там нет ни одного try/catch. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:19 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кв зависимости от каких-то условий вернуть разные вью. Вернуть вью - это не знать он них :) Он может вернуть "название вью".Ну вот, это и есть логика управления представлением, о чём я и говорю. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:20 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУинформацию о прохождении валидации и т.п.При ошибках соапной валидации до вызова метода дело не дойдёт. А прикладная валидация - это часть прикладной логики, которая должна располагаться в репозитарии, если следовать декларируемым тобою принципам. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:23 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУ http://msdn.microsoft.com/ru-ru/library/gg416511(v=vs.98).aspx советы гореархитерторов поскипаныВот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:26 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУВо многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch.Повторюсь, в WCF есть возможность централизовать обработку ошибок, написав соответствующий ServiceBehavior. В аспнете есть аналогичные возможности. Я же дал реальный пример, там нет ни одного try/catch. Да не суть, есть возможность в wcf - и шут с ней. Я говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных . Вот основной момент. А как ты там обработаешь ошибку, второй момент. Алексей КНу вот, это и есть логика управления представлением, о чём я и говорю. :-) Это не "управление представлением" :) Алексей КМСУпропущено... Вот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет. Жжешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Вынес в отдельный рецепт: Рекомендация MS об использовании репозитория в MVC Оргаждаю неофитов... )) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:35 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных . Вот основной момент. А как ты там обработаешь ошибку, второй момент.Основной момент в том, что тут описано максимальное количество слоёв, которые можно реализовать в данной архитектуре. А вот нужны ли они мне все в моём конкретном случае - это уже моё личное дело, и если я какие-то слои посчитаю ненужными в данном проекте - никто не в праве осуждать меня за это. У меня одна из целей - сократить размер программы. Как ни крути, это один из наиболее эффективных способов сократить время разработки. МСУАлексей КНу вот, это и есть логика управления представлением, о чём я и говорю. :-) Это не "управление представлением" :)Называй это как хочешь. :-) МСУАлексей Кпропущено... Вот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет. Жжешь.Скорее плачу... Планета деградирует... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КОсновной момент в том, что тут описано максимальное количество слоёв, которые можно реализовать в данной архитектуре. Не максимальный, а минимальный. Можно добавить для более сложных случаев слой сопоставления . Описано в том же мануале от MS, который ты по непонятным причинам забраковал. Алексей КА вот нужны ли они мне все в моём конкретном случае - это уже моё личное дело, и если я какие-то слои посчитаю ненужными в данном проекте - никто не в праве осуждать меня за это. У меня одна из целей - сократить размер программы. Как ни крути, это один из наиболее эффективных способов сократить время разработки. Ну хочешь "гавнокодить в обработчиках" - твоё право. Но тема у нас - репозиторий, не забыл? :) Напоминаю, я некоторые еще товарищи объяснили автору, что IQueryable в репозитории - это зло. И объяснили почему. Ты встрял и начал ругаться на нас. В чем смысл твоих высказываний тогда, если тебе репозитории не нуждны? :) Алексей КСкорее плачу... Планета деградирует... Пойду попью кофейку, буду много думать об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:46 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУНу хочешь "гавнокодить в обработчиках" - твоё право."Гавнокодить" можно в любом месте. Наличие дополнительного слоя автоматически не избавляет от "говнокода". Более того, "гавнокод" в нескольких слоях гораздо хуже "гавнокода" в одном слое. МСУНо тема у нас - репозиторий, не забыл? :)Всё правильно. Мы говорим об их нужности в различных условиях. :-) МСУАлексей КСкорее плачу... Планета деградирует... Пойду попью кофейку, буду много думать об этом.Приятного аппетита. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:54 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей К"Гавнокодить" можно в любом месте. Наличие дополнительного слоя автоматически не избавляет от "говнокода". Так никто не заставляет от него избавляться, если тебе он так дорог. Речь идет о: МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных. Алексей КБолее того, "гавнокод" в нескольких слоях гораздо хуже "гавнокода" в одном слое. Смотря с какой стороны посмотреть :) Алексей КВсё правильно. Мы говорим об их нужности в различных условиях. :-) Не ссать людям в глаза врать! Речь была о IQueryable в контроллере, за который ты так рьяно выступал Не стыдно? :) Алексей КПриятного аппетита. :-) Спасибо :) P.S. Какой итог? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:00 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КНу могу дать другой пример. Не для слабонервных И где тут IQueryable для клиентов? :)+1 Пример к теме проблем репозитория вообще не относится. Репозитоий я могу использовать повторно в рамках одного проекта. В разных проектах. А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое? Или сейчас начнётся: ну у меня одна база, один сервис, больше этот функционал нигде не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:02 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных.А зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо? МСУP.S. Какой итог? )Очевидно, я молодец! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах. А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Иногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:07 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA, ладно, Лёшу одного товарища попинали за IQueryable в репозитории. Оказалось, что у него репозиториев вообще нет и он имел ввиду (о боже!) про нужность репозитория как класс :) Таким образом, все поняли, что у Алексея нет никаких IQueryable реп и хорошо. Но остаётся у нас на повестке дня вопрос с hVostt hVosttя понял. речь идёт о необъяснимых вещах. вы так не переживайте, я видел достаточно серьезные проекты давайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение. hVosttМСУhVostt, были озвучены 3 главные причины, почему IQueryable в репозитории это плохо: 1. Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика. 2. "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев. 3. И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли. Всё это: жесткие архитектурные ограничения. Нравится прибивать на каждый чих себя гвоздями? Я не против. У меня все репозитории (сервисы данных) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно. 3 главные причины, с которыми я полностью согласен. Так я не понял, наш очень опытный и замечательный hVostt использует IQueryable репозитории или он просто вышел опять посмердить на форуме? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КА зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо? Ну если тебе ничего не надо отделять, нах тебе нужен WCF как третий уровень, пиши двузвенку и дергай БД прямо из своих впф клиентов. Ась? Алексей КМСУP.S. Какой итог? )Очевидно, я молодец! С этим никто не спорит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:11 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах. А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КА зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо? Ну если тебе ничего не надо отделять, нах тебе нужен WCF как третий уровень, пиши двузвенку и дергай БД прямо из своих впф клиентов. Ась?На Делфи ещё предложи, ага... МСУАлексей Кпропущено... Очевидно, я молодец! С этим никто не спорит :)Это главное. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:13 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга. Расскажи нам про базовые принципы рефакторинга? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:13 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга. Расскажи нам про базовые принципы рефакторинга? А про ООП почему не надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КА про ООП почему не надо? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:16 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах. А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов?Дак он итак паблик То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. А если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе? Опять тянуть сборку WCF сервиса? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:20 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAОпять тянуть сборку WCF сервиса? Алексей очень много и красиво писал на форуме про слабосвязность кода (IoC и DI), но как мы видим по его wcf сервису всё не так эпично, как давече представлялось ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУskyANA, ладно, Лёшу одного товарища попинали за IQueryable в репозитории.Дак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно. Ну дак то, что в частном конкретном случае с IQueryable нет проблем, ни о чём не говорит, кроме как о том, что в частном конкретном случае с IQueryable нет проблем. Мне интересно, что это за продукт и под какой нагрузкой работает сервис? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Сделать его public и получить к нему доступ из других классов?Дак он итак паблик Таки нет. :-) skyANAТо есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. Ну сделать для него обёртку? Код: c# 1. 2. 3.
skyANAА если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе? Опять тянуть сборку WCF сервиса?Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:30 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код? Я убегаю. Может завтра... Всем приятных выходных! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:31 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУskyANAОпять тянуть сборку WCF сервиса? Алексей очень много и красиво писал на форуме про слабосвязность кода (IoC и DI), но как мы видим по его wcf сервису всё не так эпично, как давече представлялось Я всегда был противником повсеместного IoC и DI. У меня до сих пор смешанные чувства по этому поводу. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA, да хрен его знает, что там реально за архитектура. В "IQueryable-слое" по большому счету смысла особого не вижу, т.к. его дата контекст и так таблицы и вьюхи в IQueryable возвращает. Разве что писать линейную генерик-обертку над дата контекстом? Вот это точно бред. Короче, всё туманно... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:33 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Дак он итак паблик Таки нет. :-)Точно! Класс паблик, а метод нет. :) Алексей КskyANAТо есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. Ну сделать для него обёртку? Код: c# 1. 2. 3.
Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать? Алексей КskyANAА если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе? Опять тянуть сборку WCF сервиса?Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-)А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 13:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Таки нет. :-)Точно! Класс паблик, а метод нет. :) Алексей Кпропущено... Ну сделать для него обёртку? Код: c# 1. 2. 3.
Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать?Обёртку в виде свойства P2, чтобы: " То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. " skyANAАлексей Кпропущено... Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-)А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая. С чем я не сталкивался? С необходимостью иметь в фабрике контекстов свойство ConnectionString, чтобы иметь возможность настраивать подключение, в том числе и к тестовой БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 19:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код? Ну попробуйте. Только обязательно нужна количественная оценка объёма кода, который потребуется написать при добавлении тех или иных возможностей, по сравнению с "правильным" вариантом решения. Голые ссылки на теорию не интересны. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 19:34 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAДак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно.А меж тем, всё это делается ради расширения возможностей повторного использования. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 19:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУВ "IQueryable-слое" по большому счету смысла особого не вижуЗря. Сам же говорил, что чем больше слоёв - тем лучше. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 19:39 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Точно! Класс паблик, а метод нет. :) пропущено... Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать?Обёртку в виде свойства P2, чтобы: " То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. "Можете написать пример кода, чтобы было понятно к какому классу принадлежит свойство, как оборачивается нужный метод и как этой обёрткой пользоваться? Алексей КskyANAпропущено... А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая. С чем я не сталкивался? С необходимостью иметь в фабрике контекстов свойство ConnectionString, чтобы иметь возможность настраивать подключение, в том числе и к тестовой БД?С тем, что морду надо подключить напрямую к БД, а не через сервер приложений. Я же вроде ясно написал, будьте внимательнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 22:29 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУВ "IQueryable-слое" по большому счету смысла особого не вижуЗря. Сам же говорил, что чем больше слоёв - тем лучше. :-) А смысл? Этот слой с легкостью покрывает универсальный репозиторий. Нафига мне IQueryable лохмотья? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 22:33 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAДак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно.А меж тем, всё это делается ради расширения возможностей повторного использования.Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 22:35 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Зря. Сам же говорил, что чем больше слоёв - тем лучше. :-) А смысл? Этот слой с легкостью покрывает универсальный репозиторий. Нафига мне IQueryable лохмотья? :)А действительно. Накой в базе "лохмотья" запросов в виде View/Inline UDF. Срочно убрать, всё должно делаться хранимыми процедурами, имеющими конкретный план выполнения. :-) Тут тоже самое, IQueryable/Expression - это фрагменты запросов с возможностью их повторного использования. Согласен, гемора с ними больше, но при умелом их применении производительность вырастает в разы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 19:48 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... А меж тем, всё это делается ради расширения возможностей повторного использования.Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)?Не парьтесь, Вам это не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 19:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)?Не парьтесь, Вам это не надо.Хахаха, мужик, понял, с тобой лучше не общаться. Бывай. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 21:16 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. Сохранение static полей класса между запросами ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items. [ThreadStatic]- неудачное решение в контексте ASP.NET. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 11:59 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. Сохранение static полей класса между запросами ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items. [ThreadStatic]- неудачное решение в контексте ASP.NET.К чему тут эта ссылка? ХреноРедька оказался неправ. В том топике ниже опровержение этого утверждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 12:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Сссылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net. По моему корреляция на лицо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 12:39 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAСссылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net. По моему корреляция на лицо.А по-моему - нет. Какое имеет отношение к репозитариям моя реализация управления временем жизни EF-контекста? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 12:49 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAтам началось обсуждениеОно там давно уже закончилось... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 12:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAСсылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net. По моему корреляция на лицо.А по-моему - нет. Какое имеет отношение к репозитариям моя реализация управления временем жизни EF-контекста?Я не собираюсь с Вами дискутировать, но Вы бы читали, что пишите. А зачем тогда Вы вообще упомянули свою реализацию в теме "IRepository как пользоваться", если она не имеет к ней вообще никакого отношения? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 13:10 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAЯ не собираюсь с Вами дискутироватьВот и замечательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 13:23 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA, честно говоря я тоже не понял, нафига ты эту ссылку запостил. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 13:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУ, чтобы разобраться в вопросе ТС: 14914140 . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 14:00 |
|
|
start [/forum/topic.php?all=1&fid=17&tid=1349917]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
549ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
289ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 1177ms |
0 / 0 |