Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVostt, хм а для таких случаев делаю через RenderPartial / RenderAction вызываю или нет и концепция сохраняется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 11:59 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttef, например как раз и предоставляет айквериэйбл, типа микроконтроллера. никакого доступа к орму нет. только легкое ненавязчивое управление выводом. 1. Еще раз не совем понятно, что за "ненавязчивое управление выводом" и в каком слое оно реализовано? 2. Какой-такой микроконтроллер? :) Ты, наверное, рассуждаешь о неком IService или фабрике? Опять же, в каком слое? 3. Давай всё по-порядку, рассмотрим 3 слоя: модель, представление и контроллер (можно четвертый слой ввинтить - модель представления). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:04 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУ, Код: 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. как видно все, что нужно для работы инжектируется в контроллер каким-то внешним объектом (депенси ресолвером), оно же управляет временем жизни. зачем отдавать вью квери и параметры сортировки? ну, например, хотя бы потому, что вью может выбрать столько, сколько нужно и отсортировать в соответствии со видом и назначением вью (например, параметры сортировки для атома всегда одни и те, же в независимости от того, что там хочет контроллер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:19 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
представленный выше пример достаточно примитивный, конечно в реальном большом проекте фильтры/сортировки инкапсулируются в отдельные структуры, и во вью отдаётся специальный моделвью но в использовании iqueryable ничего плохого нет, я считаю. так как сломать данные (базу) нельзя, отсутствует доступ к контексту и к unitofwork, все что можно делать, это сортировать и фильтровать. но при развитии проекта, iqueryable все реже перепадает вью. я знаю, что различные гуру советуют все упаковывать во вью модель и только так. не согласен с ними. заочно не согласен с любыми позициями, где фигурируют слова «только вот так, и никак иначе» :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:26 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУhVosttef, например как раз и предоставляет айквериэйбл, типа микроконтроллера. никакого доступа к орму нет. только легкое ненавязчивое управление выводом. 1. Еще раз не совем понятно, что за "ненавязчивое управление выводом" и в каком слое оно реализовано? 2. Какой-такой микроконтроллер? :) Ты, наверное, рассуждаешь о неком IService или фабрике? Опять же, в каком слое? 3. Давай всё по-порядку, рассмотрим 3 слоя: модель, представление и контроллер (можно четвертый слой ввинтить - модель представления). дали тебе список солдат. ты как, вью можешь разделить их по ротам, отделениям и взводам, разместив их по группам на большом экране. но если вдруг у тебя маленький экранчик 320пикс шириной, ты покажешь только группировку по взводам, а в них отобразишь командиров отделений. вот как-то так. простейший пример. микроконтроллер, я так называю некоторые самодостаточные интерфейсы, IEnumerable и IQueryable вкупе с LINQ одни из них. т.е. универсальные сервисы. еще это могут быть всякие IPageable, IRoleable.... то, что эти насквозь прошивают «великую и могучую» MVC не нарушает её принципов, если не нарушают принципов независимости и самодостаточности. как говорится, не плодите лишних сущностей :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:37 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttкак видно все, что нужно для работы инжектируется в контроллер каким-то внешним объектом (депенси ресолвером), оно же управляет временем жизни. В большинстве случаев (а их 99%) достаточно ручной инстанциации экземпляра (IProjectRepository) - через конструктор базового контроллера. У тебя он отсутствует. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. В IDataService - только IEnumerable , никаких квери и еще что-либо. Код: c# 1. 2. 3. 4. 5. По причине того, что мы можем подключить сторонний датасервис, например, XmlDataService, который ничего не знает о трансляции SQL. IEnumerable - это бест практис. hVosttзачем отдавать вью квери и параметры сортировки? ну, например, хотя бы потому, что вью может выбрать столько, сколько нужно и отсортировать в соответствии со видом и назначением вью (например, параметры сортировки для атома всегда одни и те, же в независимости от того, что там хочет контроллер) Как решается эта задача - в IDataService: Код: c# 1. Всё. А в своём SqlDataService или XmlDataService делаешь реализацию. Из контроллера: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. Идея понятна? P.S. Слишком много инъекций с ресолвами, код выглядит загаженно и удручающе. В моем случае - код чистый, инкапсуляция рулит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:43 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVostt, ваша позиция ясна) а вам никто не говорил делать так и не иначе по другому. на вкус и цвет фломастеры разные) но чет смущает меня. зачем к примеру зачем отдельный репозиторий, если есть UoW? или то что код загажен как то, хотя я может не прав тут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:50 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУ, нееет, батенька )) про 99% разработчиков, не применяющих TDD вы конечно загнули. ладно, забьём на тесты, русские тру-кодеры хотели покакать на это ваше тестирование с большой мариуопольской вышки. кейс №1. базовый контроллер — это плохо. это действительно плохо, так как рулить контроллерами должна фабрика, а не инкапсуляция. а мало ли чего (мы же забыли про тесты, та?). если хотябы фабрика своя и она даёт датасервис каждому контроллеру... ну это вообще жуть. получается каждый контроллер де-факто имеет доступ ко всей дата бейз? ну и ну. поехали дальше. почему репа и сервис — вещи разные. потому что репа, это инстанс дженерика почти во всех случаях. ну а про тесты мы уже даже и не вспоминаем. а сервис, более умный брат репы, так как знает больше умных слов, чем чего-то откуда-то взять и куда-то сохранить. а еще в сервис может инжектироваться кеш-провайдер. и сервис будет послушно брать данные из кеша, при чем даже не догадываясь, как это вообще получилось. едем дальше. наконец, кейс. реальный! жил-проект. у него все было в одной базе и все было круто. потом вдруг этот проект попадает в стек других проектов, где есть своя база данных пользователей, ролей и прочей профильной фигни. как же это решается? ничегошеньки переделывать не надо. пишется реализация IUserRepository, подсовывается в депенси ресолвер. в итоге, ни один контроллер, ни один сервис, ни один фильтр не почувствал разницы. ок? заказчик доволен, программеры в экстазе. все решилось быстро и без нервотрепки. ну и на последок. ладно вы отдаете в контроллер инстанс датасервиса через базовый класс. а кто отдает этот инстанс различным фильтрам? в том числе глобальным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:55 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
handmadeFromRuзачем к примеру зачем отдельный репозиторий, если есть UoW? Немного не понял, о каком репозитории речь? :) У меня нет репозиториев, у меня абстракция для контроллера - IDataService. С реализациями в виде SqlDataService, XmlDataService и т.д. Подключай к базовому контроллеру любой провайдер (сервис), и твоё приложение будет крутиться на новых рельсах (вроде инкапсулированного мока). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:56 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
handmadeFromRu, потому что у UoW одна задача — сделать дать сделать коммит (или не дать). ради чего в этот вов пихают свои сервисы и репы не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 12:57 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУ, и эта.. IDataService это не абстракция )) это весьма конкретный дай-сюда-это, возьми-вот-это, сделай-как-то-так. интерфейсом зовётся. ну если только это не обстракция в виде: IDataService { MyDbContext Context {get;} } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:03 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttМСУ, нееет, батенька )) про 99% разработчиков, не применяющих TDD вы конечно загнули. Я ничего не говорил про "неприменение TDD". Мой "вариант" так же легко можно тестировать. hVosttладно, забьём на тесты, русские тру-кодеры хотели покакать на это ваше тестирование с большой мариуопольской вышки. Не согласен. Тестирование - это хорошо, я это не отрицаю :) Просто главное понимать, тесты пишутся для программ, но не наоборот. Это я к 100% покрытию (шизофрения). hVosttкейс №1. базовый контроллер — это плохо. это действительно плохо, так как рулить контроллерами должна фабрика, а не инкапсуляция. а мало ли чего (мы же забыли про тесты, та?). если хотябы фабрика своя и она даёт датасервис каждому контроллеру... ну это вообще жуть. получается каждый контроллер де-факто имеет доступ ко всей дата бейз? ну и ну. 1. Ну так рули в базовом контроллере, хоть руками, хоть через фабрику. Какая принципиальная разница? Зато я не размазываю эту логику в самих прикладных контроллерах. Даешь чистый контроллер! 2. Каждый контроллер де-факто не имеет доступ ко всей дата бейз, каждый контроллер де-факто имеет доступ своему IDataServive. Почувствуй разницу. hVosttпоехали дальше. почему репа и сервис — вещи разные. потому что репа, это инстанс дженерика почти во всех случаях. Чё-то я нифига не понял, еще раз - причем тут вообще дженерик? Репозиторий так же не обязан быть дженериком. hVosttа сервис, более умный брат репы, так как знает больше умных слов, чем чего-то откуда-то взять и куда-то сохранить. а еще в сервис может инжектироваться кеш-провайдер. и сервис будет послушно брать данные из кеша, при чем даже не догадываясь, как это вообще получилось. Да это принципиально одно и то же, у меня просто абстракция в дата слое. hVosttедем дальше. наконец, кейс. реальный! жил-проект. у него все было в одной базе и все было круто. потом вдруг этот проект попадает в стек других проектов, где есть своя база данных пользователей, ролей и прочей профильной фигни. как же это решается? ничегошеньки переделывать не надо. пишется реализация IUserRepository, подсовывается в депенси ресолвер. в итоге, ни один контроллер, ни один сервис, ни один фильтр не почувствал разницы. ок? заказчик доволен, программеры в экстазе. все решилось быстро и без нервотрепки. Так у меня точно так же, пишется свое реализация IDataService (например, был SqlDataService, а стал WcfDataService или XmlDataService). Потом в базовом конструкторе кентроллера мы подключили наш новый сервис и всё стало так же работать (через абстракции IDataService). Ты читаешь как-то между строк, что-ли? Или я пишу непонятно :) hVosttну и на последок. ладно вы отдаете в контроллер инстанс датасервиса через базовый класс. а кто отдает этот инстанс различным фильтрам? в том числе глобальным? Выражайся по-русски, инопланетяне сейчас не в моде. Какой фильтр? Что такое глобальный фильтр, ты о чем вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:06 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttМСУ, и эта.. IDataService это не абстракция )) это весьма конкретный дай-сюда-это, возьми-вот-это, сделай-как-то-так. интерфейсом зовётся. ну если только это не обстракция в виде: IDataService { MyDbContext Context {get;} } Нет, это абстракция. Код: c# 1. 2. 3. 4. 5. P.S. Мляяя, сорри, я понял ошибку Я в начале написал "class", а надо "interface". Разумеется, речь о interface, сорри Из-за этого сыр-бор :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:08 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУ эт я hVostt вопрос адресовал) hVostt, ну да но uow и репо близки. честно ...чет я сам запутался. загуглил сюды http://stackoverflow.com/questions/7940854/is-unit-of-work-and-repository-patterns-very-useful-for-big-projects uow - это типа буфера для команд обновления БД репозиторий - это ОО интерфейс к данным. он же отслеживает изменения в модели и выдает команды к uow фишка в том, что все крупные ORM - это UoW + Repository собственно из-за этого и спросил про зачем они вместе лежат по мне EF + тонкий интерфейс над ним - вот и все, что нужно. или вам надо сделать абстракцию над орм? ...я думаю переезды на другую орм ..я хз событие как конец света - редкое, но веселое)! п.с. надеюсь я еще адекватен и не в бреду и правильно понял) даешь пятницу в среду!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:21 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУhVosttМСУ, нееет, батенька )) про 99% разработчиков, не применяющих TDD вы конечно загнули. Я ничего не говорил про "неприменение TDD". Мой "вариант" так же легко можно тестировать. хотел бы я на это посмотреть. МСУhVosttкейс №1. базовый контроллер — это плохо. это действительно плохо, так как рулить контроллерами должна фабрика, а не инкапсуляция. а мало ли чего (мы же забыли про тесты, та?). если хотябы фабрика своя и она даёт датасервис каждому контроллеру... ну это вообще жуть. получается каждый контроллер де-факто имеет доступ ко всей дата бейз? ну и ну. 1. Ну так рули в базовом контроллере, хоть руками, хоть через фабрику. Какая принципиальная разница? Зато я не размазываю эту логику в самих прикладных контроллерах. Даешь чистый контроллер! 2. Каждый контроллер де-факто не имеет доступ ко всей дата бейз, каждый контроллер де-факто имеет доступ своему IDataServive. Почувствуй разницу. получается, вы размазали свой код не вдоль, а поперёк. Действительно, какая принципиально разница? Вы выиграли только визуально (меньше кода в контроллере отображается), но функционально.... в общем дабы избежать долгого спора, раньше я именно так и делал (как вы) :) вот практически один в один, базовый контроллер, большой дата сервис (обстракция!). но потом пришло время расти. надо было 100% тестирование. это не шиза, это реальное условие заказчика (к вопросу об условиях заказчика, в особенности зарубежного). МСУhVosttпоехали дальше. почему репа и сервис — вещи разные. потому что репа, это инстанс дженерика почти во всех случаях. Чё-то я нифига не понял, еще раз - причем тут вообще дженерик? Репозиторий так же не обязан быть дженериком. это я к слову сказал. но чтобы было понятней: Repository<TEntity>: IRepository<TEntity>... скафолдинг и кодогенерация (а ручки-то вот они где) МСУhVosttа сервис, более умный брат репы, так как знает больше умных слов, чем чего-то откуда-то взять и куда-то сохранить. а еще в сервис может инжектироваться кеш-провайдер. и сервис будет послушно брать данные из кеша, при чем даже не догадываясь, как это вообще получилось. Да это принципиально одно и то же, у меня просто абстракция в дата слое. не одно и тоже. репу можно подсунуть другую, сервис будет работать с любой репой. а вот если надо переписывать весь сервис из-за смены Sql на Xml (кстати, хотел спросить что за пример такой допотопный, кому вообще может прийти в голову менять Sql на Xml? или веб-сервис? я еще понимаю монго, мемори...) МСУhVosttедем дальше. наконец, кейс. реальный! жил-проект. у него все было в одной базе и все было круто. потом вдруг этот проект попадает в стек других проектов, где есть своя база данных пользователей, ролей и прочей профильной фигни. как же это решается? ничегошеньки переделывать не надо. пишется реализация IUserRepository, подсовывается в депенси ресолвер. в итоге, ни один контроллер, ни один сервис, ни один фильтр не почувствал разницы. ок? заказчик доволен, программеры в экстазе. все решилось быстро и без нервотрепки. Так у меня точно так же, пишется свое реализация IDataService (например, был SqlDataService, а стал WcfDataService или XmlDataService). Потом в базовом конструкторе кентроллера мы подключили наш новый сервис и всё стало так же работать (через абстракции IDataService). Ты читаешь как-то между строк, что-ли? Или я пишу непонятно :) вы лезете в конструктор контроллера и что-то там меняете, чтобы сменить сервис. и после этого вы мне говорите, что ваше решение готово к TDD? вы издеваетесь? МСУhVosttну и на последок. ладно вы отдаете в контроллер инстанс датасервиса через базовый класс. а кто отдает этот инстанс различным фильтрам? в том числе глобальным? Выражайся по-русски, инопланетяне сейчас не в моде. Какой фильтр? Что такое глобальный фильтр, ты о чем вообще?[/quot] ActionFilter, ActionFilterAttrribute, AuthorizationFilterAttribute..... etc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:22 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
уууу, вот поперла тема! Пиво и попкорн закупил вечером после раббы почитаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:36 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
хотел бы разъяснить, почему я провожу четкую черту между сервисом и репозиторием вот репозиторий: Код: 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. репы для остальных сущностей делаются так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. ничего нового? ну это нужно потому, что отдельные сущности могут потребовать каких-то сложных ресурсоёмких операций, которые должны быть реализованы именно в слое данных (вьюха или табличная процедура в базе, например), но это редкий случай. выборки, даже сложные в LINQ обычно отрабатывают достаточно быстро, а с учетом кеширования.... а вот сервис, это такой умный братан репы, который знает много контекстно-зависимых слов: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. реализован сервис полностью через репозиторий. поэтому достаточно сменить репу. при чем, репу сменить можно всего одной строчкой в конфиге CS или даже в web.config, так что эта репа будет использоваться везде в проекте. при чем репу можно сменить для отдельной сущности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:41 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
handmadeFromRuМСУ эт я hVostt вопрос адресовал) hVostt, ну да но uow и репо близки. честно ...чет я сам запутался. загуглил сюды http://stackoverflow.com/questions/7940854/is-unit-of-work-and-repository-patterns-very-useful-for-big-projects uow - это типа буфера для команд обновления БД репозиторий - это ОО интерфейс к данным. он же отслеживает изменения в модели и выдает команды к uow фишка в том, что все крупные ORM - это UoW + Repository собственно из-за этого и спросил про зачем они вместе лежат по мне EF + тонкий интерфейс над ним - вот и все, что нужно. или вам надо сделать абстракцию над орм? ...я думаю переезды на другую орм ..я хз событие как конец света - редкое, но веселое)! п.с. надеюсь я еще адекватен и не в бреду и правильно понял) даешь пятницу в среду!!! у EF DbContext это UnitOfWork. но мы делаем свой UoW, поверх него. задача у него одна, принципиальная. в контроллер мы никогда не прокидываем DbContext. а сохранять данные как-то надо. прокидываем IUnitOfWork, у которого есть Save (или Commit, кому как нравится). да, он может много чего еще. отслеживать изменения данных, вешаясь на определенные события, если надо. в общем, действовать как транзакционная машина, обрабатывать программные триггеры. ну и самое главное. если в контроллере нет IUnitOfWork, значит он гарантированно 100% ничего в базу не сохраняет. только берет. это важный в разработке ньюанс. на самом деле приведенный выше код, это не «много грязи в коде», это кристальная ясность относительно того, что контроллер делает. а если контроллер чист, типа все ему передается через базовый класс, то не понятно ничего. надо копать. в большом проекте ковыряться для выяснения обстоятельств, — нудное и безынтересное занятие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:51 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttхотел бы я на это посмотреть. Гавно вопрос, выложил сюда подход: http://codearticles.ru/Home/ArticleView/2155 hVosttполучается, вы размазали свой код не вдоль, а поперёк. Действительно, какая принципиально разница? Вы выиграли только визуально (меньше кода в контроллере отображается), но функционально.... 1. Визуальность рулит, дружище. Смотреть в каждый код на тонны гавнокода, гвоздями прибитого к фабрикам, репозиториям, датасервисам... Бррр. Вспомни о трёх китах объектно-ориентированного программирования :) 2. Функционально я не проигрываю, сколько раз тебе объяснять, могу еще раз объяснить это. Ты просто помешан на резолвах в локаторах, а я объясняю, что в большинстве случаев и инстанция подойдет - главное, что она в одном месте . Зачем мне 100500 резолвов, размазанных в 100500 контроллерах, если я один раз в базовом контроллере инстанциируюсь и все унаследованные контроллеры получат своего поставщика. hVosttв общем дабы избежать долгого спора, раньше я именно так и делал (как вы) :) вот практически один в один, базовый контроллер, большой дата сервис (обстракция!). но потом пришло время расти. надо было 100% тестирование. это не шиза, это реальное условие заказчика (к вопросу об условиях заказчика, в особенности зарубежного). Ты в упор не видишь то, что я пишу? Еще раз - мой вариант отлично тестируемый, ничем не уступает твоему. Но главный его плюс - это его чистота, посмотри в примере в аттаче и сравни со своей "грязной" реализацией. hVosttэто я к слову сказал. но чтобы было понятней: Repository<TEntity>: IRepository<TEntity>... скафолдинг и кодогенерация (а ручки-то вот они где) На свалку, ибо Repository может зависить от n entity. А если у на 2 БД, плодить два репозитория и делать 2 подключения к БД? :) У меня же IDataService более "абстрактен", к нему можно прибить 2 базы данных (по сути это одно хранилище, разнесенное по базам - так, к примеру, шарепоинт работает), а на выхлопе использовать родные сущности. И всё это счастье за единый коннекшен (в твоем случае их будет уже два). Кстати, один из минусов ORM это то, что они прибиваются к одной БД в разрезе контекста. Последствия сам понимаешь какие. Я же всегда могу обойти это в своем слое (на ридерах вмапиться в прокси классы) за одно физическое соединени к БД. hVosttне одно и тоже. репу можно подсунуть другую, сервис будет работать с любой репой. а вот если надо переписывать весь сервис из-за смены Sql на Xml (кстати, хотел спросить что за пример такой допотопный, кому вообще может прийти в голову менять Sql на Xml? или веб-сервис? я еще понимаю монго, мемори...) Ну почему допотопный, вот тебе ситуация из жизни. Нужно писать софт, ТЗ готово, всё готово, люди пишут. Но планируется, что через n-месяцев, когда будет запущено сторонее приложение (пусть на аксапте) мы будем осуществлять поставку данных через эту систему - например, некоторые справочники и служебные данные. Мы пишем свой Sql сервис и спокойно живем. Потом, когда вклинивается аксапта и говорит - берите данные теперь через меня, мы переключаем своё приложение на новый источник - через аксаптовых WCF сервис. Классическое интеграционное решение, просто ты в таких не участвовал, это видно невооруженным глазом :) Я ж говорю, меняй стереотипы, иначе так и помрешь в неведении )) hVosttвы лезете в конструктор контроллера и что-то там меняете, чтобы сменить сервис. и после этого вы мне говорите, что ваше решение готово к TDD? вы издеваетесь? Никто не мешает управлять точно так же через резолвинг через тот же автофак. Зри в корень, а не плавай на поверхности. hVosttActionFilter, ActionFilterAttrribute, AuthorizationFilterAttribute..... etc. См. выше, ты можешь управлять экземпляром в единой песочнице и подсовывать ее в базовый конструктор, фильтры и иже с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 13:56 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttхотел бы разъяснить, почему я провожу четкую черту между сервисом и репозиториемрепы для остальных сущностей делаются так Лишняя работа, обреченная на гавнокод. hVosttа вот сервис, это такой умный братан репы, который знает много контекстно-зависимых слов: Говорю же, лишнее расслоение. В моем случае я создал бы новый IProjectService и научил бы его последователей всему тому, что требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:01 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУhVosttхотел бы я на это посмотреть. Гавно вопрос, выложил сюда подход: http://codearticles.ru/Home/ArticleView/2155 Посмотрю сегодня вечером, о результатах отпишусь :-) МСУhVosttполучается, вы размазали свой код не вдоль, а поперёк. Действительно, какая принципиально разница? Вы выиграли только визуально (меньше кода в контроллере отображается), но функционально.... 1. Визуальность рулит, дружище. Смотреть в каждый код на тонны гавнокода, гвоздями прибитого к фабрикам, репозиториям, датасервисам... Бррр. Вспомни о трёх китах объектно-ориентированного программирования :) 2. Функционально я не проигрываю, сколько раз тебе объяснять, могу еще раз объяснить это. Ты просто помешан на резолвах в локаторах, а я объясняю, что в большинстве случаев и инстанция подойдет - главное, что она в одном месте . Зачем мне 100500 резолвов, размазанных в 100500 контроллерах, если я один раз в базовом контроллере инстанциируюсь и все унаследованные контроллеры получат своего поставщика. 1. Никакой тонны. Я смотрю на то, с чем работаю. Вижу IUnitOfWork, значит понимаю, что могу сохранять данные. Вижу сервис с определенным названием, значит знаю какую область я решаю. Хорошо, когда помнишь. Плохо, когда уже подзабыл, или вас несколько человек работает над одним проектом. Абсолютно ничего лишнего. Я вижу с чем работает контроллер, а не лажу в базовый класс, чтобы разобраться что мне оттуда приходит. В этом и прелесть, дружище :) 2. Она у тебя в базовом контроллере. Считаешь, это лучшее место для управления жизнью инстансов, которые могут понадобиться еще и за пределами контроллера (фильтры, например)? МСУ... Но главный его плюс - это его чистота, посмотри в примере в аттаче и сравни со своей "грязной" реализацией. про тестирование, вечером гляну. а вот грязи никакой нет. класс самодостаточен, я вижу что он получает при создании (конструктор), вижу что он хранит. я могу создать такой контроллер отдельно, вообще в другой сборке. это самый чистый контроллер из всех. МСУhVosttэто я к слову сказал. но чтобы было понятней: Repository<TEntity>: IRepository<TEntity>... скафолдинг и кодогенерация (а ручки-то вот они где) На свалку, ибо Repository может зависить от n entity. А если у на 2 БД, плодить два репозитория и делать 2 подключения к БД? :) У меня же IDataService более "абстрактен", к нему можно прибить 2 базы данных (по сути это одно хранилище, разнесенное по базам - так, к примеру, шарепоинт работает), а на выхлопе использовать родные сущности. И всё это счастье за единый коннекшен (в твоем случае их будет уже два). Кстати, один из минусов ORM это то, что они прибиваются к одной БД в разрезе контекста. Последствия сам понимаешь какие. Я же всегда могу обойти это в своем слое (на ридерах вмапиться в прокси классы) за одно физическое соединени к БД. мда... :) мы похоже забыли про прослойку EF, которой можно отдать другой провайдер данных в конфиге, или другую строку соединения. речь идёт о принципиальной смене поставщика данных. DbContext там не катит. поэтому приложение ничего не знает об это контексте. он работает только с сервисами и репами. МСУЯ ж говорю, меняй стереотипы, иначе так и помрешь в неведении )) а вы... а вы.. )) уничтожаете мои стереотипы, как не стыдно! МСУНикто не мешает управлять точно так же через резолвинг через тот же автофак. Зри в корень, а не плавай на поверхности. ну если так, другое дело. просто вы говорите, можно, но так не делаете. значит для TDD вам потребуется подгонка проекта. ну может вам перепадёт заказ со 100% тдд, а вы их окрестите шизой )) МСУhVosttActionFilter, ActionFilterAttrribute, AuthorizationFilterAttribute..... etc. См. выше, ты можешь управлять экземпляром в единой песочнице и подсовывать ее в базовый конструктор, фильтры и иже с ним. единая песочница где находится? это синглетон? статик класс? отдельный менеджер? что бы вы не назвали, оно тоже должно где-то находиться )) только вот, что это за мифическая штуковина, которая снабжает инстантами контроллеры, фильтры и следит за временем их жизни? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:15 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
МСУhVosttхотел бы разъяснить, почему я провожу четкую черту между сервисом и репозиториемрепы для остальных сущностей делаются так Лишняя работа, обреченная на гавнокод. интересный вывод )) жаль, не приправленный доводами... знаете, как-то безвкусно, может найдется щепотка... чего-нибудь? МСУhVosttа вот сервис, это такой умный братан репы, который знает много контекстно-зависимых слов: Говорю же, лишнее расслоение. В моем случае я создал бы новый IProjectService и научил бы его последователей всему тому, что требуется. звучит как будто из уст проповедника )) идите мои браться, да распространится знание по миру! расслоение лишним никогда не бывает. собрать, знаете ли, на много проще, чем разобрать (в мире программирования). тем более не забывайте о Single Of Responsibility. оно знаете ли, очень хорошо выручает, когда требуется вносить изменения и на этапе интенсивной итеративной разработки. и не забывайте еще, что в человеке 206 костей, а не две-три большие. умные дядьки вообще говорили, что один класс должен выполнять одну маленькую задачу. например, одного такого зовут мартин фаулер. хотя вообще-то он просто надменный ботан, ничего не понимающий в разработке приложений. а ТДД, оно и понятно, что для шизанов )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:22 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttПосмотрю сегодня вечером, о результатах отпишусь :-) Ок, главное обращай внимание на чистоплотность кода ) hVostt1. Никакой тонны. Я смотрю на то, с чем работаю. Вижу IUnitOfWork, значит понимаю, что могу сохранять данные. Вижу сервис с определенным названием, значит знаю какую область я решаю. Хорошо, когда помнишь. Плохо, когда уже подзабыл, или вас несколько человек работает над одним проектом. Абсолютно ничего лишнего. Я вижу с чем работает контроллер, а не лажу в базовый класс, чтобы разобраться что мне оттуда приходит. В этом и прелесть, дружище :) 2. Она у тебя в базовом контроллере. Считаешь, это лучшее место для управления жизнью инстансов, которые могут понадобиться еще и за пределами контроллера (фильтры, например)? 1. А ты никогда не работает в команде? Ууу... Я точно так же вижу интерфейс сервиса, вижу его члены, значит знаю какую область я решаю. 2. Еще раз, не путай хранение сервиса в базовом контроллере и управление жизнью. Если ты хочешь управлять жизнь, ты точно так же в базовом контроллере можешь сделать ссылку на фабрику, которая выплевывает тебе экземпляр. Я тебе об этом уже битый час тылдычу, чтож так туго доходит. Не понимаешь до сих, о чем я говорбю? :) Мля, ну на пальца - ты прибиваешь свои интерфейсы в реализации прикладного контроллера. Я прибиваю - в реализации базового контроллера. Всё, только в этом разница. Нужно руками инстанциироваться - пожалуйста, хочешь честный TDD - выноси жизнь экземпляра на дополнительную абстракцию DI. Ну что ж такое-то... hVosttпро тестирование, вечером гляну. а вот грязи никакой нет. класс самодостаточен, я вижу что он получает при создании (конструктор), вижу что он хранит. я могу создать такой контроллер отдельно, вообще в другой сборке. это самый чистый контроллер из всех. Гы, ты же сам признал ранее, что грязно :) hVosttмда... :) мы похоже забыли про прослойку EF, которой можно отдать другой провайдер данных в конфиге, или другую строку соединения. речь идёт о принципиальной смене поставщика данных. DbContext там не катит. поэтому приложение ничего не знает об это контексте. он работает только с сервисами и репами. А причем тут прослойка EF, если ты генерик репозиторий прибиваешь к определенному типу контекста? Или не к типу контекста? Вот смотрю твой код репозитория, он выплевывает IQueryable. Откуда ты берешь контексты EF и как ими управляешь? Ты не показал самого главного. hVosttа вы... а вы.. )) уничтожаете мои стереотипы, как не стыдно! Ломать не строить hVosttну если так, другое дело. просто вы говорите, можно, но так не делаете. значит для TDD вам потребуется подгонка проекта. ну может вам перепадёт заказ со 100% тдд, а вы их окрестите шизой )) Ну наконец! TDD - это еще не значит, что обязательно нужен сервис локатор, согласен? :) hVosttединая песочница где находится? это синглетон? статик класс? отдельный менеджер? что бы вы не назвали, оно тоже должно где-то находиться )) только вот, что это за мифическая штуковина, которая снабжает инстантами контроллеры, фильтры и следит за временем их жизни? Да хоть ASP.NET кеш или application, без разницы :) А мифическая штука - это называется фабрика (factory). Слыхал о таком паттерне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:33 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVostt у EF DbContext это UnitOfWork. но мы делаем свой UoW, поверх него. задача у него одна, принципиальная. в контроллер мы никогда не прокидываем DbContext. а сохранять данные как-то надо. прокидываем IUnitOfWork, у которого есть Save (или Commit, кому как нравится). да, он может много чего еще. отслеживать изменения данных, вешаясь на определенные события, если надо. в общем, действовать как транзакционная машина, обрабатывать программные триггеры. ну и самое главное. если в контроллере нет IUnitOfWork, значит он гарантированно 100% ничего в базу не сохраняет. только берет. это важный в разработке ньюанс. на самом деле приведенный выше код, это не «много грязи в коде», это кристальная ясность относительно того, что контроллер делает. а если контроллер чист, типа все ему передается через базовый класс, то не понятно ничего. надо копать. в большом проекте ковыряться для выяснения обстоятельств, — нудное и безынтересное занятие. да какой то выхлоп не большой ...обертку над оберткой. как я уже писал "EF + тонкий интерфейс над ним - вот и все". ну на этом я закончу дебаты и просто попкорном запасусь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:34 |
|
||
|
Переход на MVC 4
|
|||
|---|---|---|---|
|
#18+
hVosttинтересный вывод )) жаль, не приправленный доводами... знаете, как-то безвкусно, может найдется щепотка... чего-нибудь? А какие тут доводы нужны, если ты расслаиваешь свой EF контекст и выводишь уже свои IQueryable. Нафига? EF контекст - это и так уже по сути репозиторий (кодогенеренный или codefirst). Зачем делать второй репозиторий? hVosttзвучит как будто из уст проповедника )) идите мои браться, да распространится знание по миру! Дак это баян, извини, что про тебя забыли. Сто раз перетирали, что делать второй репозиторий наж контекстом - зло. hVosttрасслоение лишним никогда не бывает. Во всём нужно знать меру. Иначе твой подход превращается в безумие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2012, 14:36 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=38093238&tid=1358916]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 455ms |

| 0 / 0 |
