|
Repository & Service
|
|||
---|---|---|---|
#18+
Господа, извеняюсь за нубские вопросы... но Вот в интернетах пишут что репозитории занимаются тем что общаются с базой данных А в Сервисах находиться бизнес логика. Далее показывают пример (можно увидеть ниже). Это только у меня ощущение что бизнес логика в этом примере в репозитории? Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте. Прокоментируйте пожалуйста... Repository Код: c# 1. 2. 3. 4. 5. 6.
Service Код: c# 1. 2. 3. 4. 5.
Client Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 15:45 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
пример очень не показательный. наверняка, при сохранении удалении будет куча проверок - вот они и есть "бизнес-логика" ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 15:57 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
причем в методах сервиса будет использоваться много репозиториев, код многих будет выполняться в транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:01 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
но даже в таком виде профит имеется - можно тестировать ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GЗачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте.Ощущение правильное, потому что в качестве репозитория выступает DbContext. авторПаттерн Repository посредничает между слоем области определения и слоем распределения данных, работая, как обычная колекция объектов области определения. Объекты-клиенты создают описание запроса декларативно и направляют их к объекту-репозиторию (Repository) для обработки. Объекты могут быть добавлены или удалены из репозитория, как будто они формируют простую коллекцию объектов . А код распределения данных, скрытый в объекте Repository, позаботится о соответсвующих операциях в незаметно для разработчика. В двух словах, паттерн Repository инкапсулирует объекты, представленыые в хранилище данных и операции, производимые над ними, предоставляя более объектно-ориентированное представление реальных данных . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:08 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленинно даже в таком виде профит имеется - можно тестироватьЕсть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:12 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ммм, вот всегда так ) Владимир Путин-Ленин говорит что так и надо и это "классика" )) а Алексей К говорит что ну их нах Сервисы можно в клиент репозитории... PS Ок понял что в сервисах проверки на нуль и прочии проверки... А это не размазывает логику между Сервисом и Репозиторием? Или нужно просто для себя запомнить что все условия для запросов находятся в репозитории? Вот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи ... можете привести какой нибудь пример? (не код, на словах) для того, чтобы понимать о чем речь. PSS транзакции в коде пока не реализовал, но планирую ... нужно будет показать что в итоге получиться Спасибо за Вашу помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:36 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем Gа Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...Я не это имел ввиду. :-) Я лишь обратил внимание на то, что под классическое определение понятия "паттерн репозитарий" попадает DbContext. А какие слои организовывать и как распределять между ними логику - это личное дело каждого, в зависимости от решаемой задачи и предпочтений. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 16:43 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КАртем Gа Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...Я не это имел ввиду. :-) Ок, понял. Если что извеняюсь ... я утрировал ... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 18:18 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
в примере видно что в Repository есть класс Category из слоя Domain вопрос: в слое Service должен быть отдельно созданый класс Category или используется класс из слоя Domain ? Я "продублировал" класс Category в Service и воспользовался AutoMapper ом ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КВладимир Путин-Ленинно даже в таком виде профит имеется - можно тестироватьЕсть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД. И какое покрытие у таких тестов? И сколько по времени они выполняются? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:09 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей Кбанально, подключить тесты к тестовой БД это, конечно, тоже надо. но, что будет тестироваться в итоге, если нет разделения? полный чОрный ящик? это хрень а не тестирование ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:09 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем Gммм, вот всегда так ) Владимир Путин-Ленин говорит что так и надо и это "классика" )) а Алексей К говорит что ну их нах Сервисы можно в клиент репозитории... PS Ок понял что в сервисах проверки на нуль и прочии проверки... А это не размазывает логику между Сервисом и Репозиторием? Или нужно просто для себя запомнить что все условия для запросов находятся в репозитории? Вот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи ... можете привести какой нибудь пример? (не код, на словах) для того, чтобы понимать о чем речь. PSS транзакции в коде пока не реализовал, но планирую ... нужно будет показать что в итоге получиться Спасибо за Вашу помощь. Сервис - это бизнес-логика . Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий). Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:13 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GВот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи ну представь, что для выполнения удаления, тебе надо сначала спросить а не "лайка бос" ли объект. а этот запрос делает другой репо. вот и их уже > 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленинно даже в таком виде профит имеется - можно тестировать И не только тестировать... Можно прозрачно сменить хранилище, можно прозрачно подключить распределённый кэш, можно прозрачно вынести базу в другую зону в целях безопасности и работать с ней через API... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:17 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GВот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи Ну к примеру пересчитать заказ в другую валюту. Где будете это делать? В контроллере? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:20 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей Ккачестве репозитория выступает DbContext заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы... если вообще не стоит задача распределить и тестировать логику, допустим это один сайт, то может и не надо так заморачиваться сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:25 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G Код: c# 1.
для придирки: локальные переменные и параметры вроде принято с маленькой буквы ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:35 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAСервис - это бизнес-логика . Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий). Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :) Сервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы. Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее... Я начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций. Потому как отклонения череваты ))) ... Иммануил КантАртем G Код: c# 1.
для придирки: локальные переменные и параметры вроде принято с маленькой буквы Да, вы правы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:51 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GЯ начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций начни писать тесты. и все станет ясно. слабосвязанная архитектура не для красоты. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 20:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GЯ начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций. Потому как отклонения череваты ))) ... Суть сервиса в том, что из него можно дергать данные из разных репозиториев, обрабатывать в соответстии с бизнес логикой и отправлять результаты обратно в репозитории. Это частный пример. Например: Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 20:03 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем Gощущение что бизнес логика в этом примере в репозитории если есть динамика в критериях выборки, то такие репозитории не годятся ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 20:13 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Есть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД. И какое покрытие у таких тестов? И сколько по времени они выполняются? Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 23:37 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GСервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы. Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее... Я бы не сказал, что сервис -- это бизнес-логика. Сервис, это сервис. Бизнес-логика, это код, который непосредственно решает задачи бизнеса, а именно: комплексные операции обработки и сохранения данных, включая проверку доступа, валидацию, операционные эффекты, генерацию сообщений, вычисления, и прочее... Т.е. всё то, для чего приложение разрабатывается. Часто бизнес-логику размазывают, особенно по контроллерам, из-за непонимания где такую логику разместить. Сервисы -- это классы, предоставляющие определённые услуги. Например, сервис данных обеспечивает прикладной код необходимыми данными. Сервис доставки сообщений обеспечивает эту доставку и всё что прилагается. И т.д. Бизнес-логика, это и есть совокупность всех различных сервисов. Но не всегда архитектура строится на сервисах, есть и другие подходы, которые практически полностью исключают необходимость создания сервис-классов. Ну а к твоему вопросу, на самом деле ответить нельзя, пока не будет условия задачи. Если приложение представляет собой сохранялку-показывалку данных, то вся логика уместится в дата-сервисах с методами Дай() и Положи() грубо говоря. В целом, из инфраструктуры презентации (контроллер, презентер, вью...) необходимо выкашивать всю бизнес-логику по максимуму. А как ты это будешь делать зависит целиком и полностью от задач. Нет какой-то универсальной архитектуры и правильного разбиения по слоям. При прототипировании, например, вполне уместно работать прям с DbContext-ом, и прям в контроллерах. Но в серьёзных проектах умные адекватные дядьки, конечно, так делать никогда не будут ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 23:53 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt, во каша в башке :) сервис, бизнес логика :) сервис - это просто сервис, услуга, которую оказывает сервер, прислуга бизнес- логика - это просто логика взаимодействия клиентов(тоже могут быть сервисами) и сервисов для достижения целей внесистемных клиентов главное найти первого внесистемного клиента если ты сервис, дальше сама пойдет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 00:40 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GЗачем вообще слой Service?Service - это совокупность репозиториев. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 04:05 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил КантАлексей Ккачестве репозитория выступает DbContext заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал. Но в определении написано именно то, что там написано. Я подхожу в данном случае чисто с формальной точки зрения, проклятый LINQ-2-SQL, и EF в частности, разрушил всю концепцию репозитариев. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 06:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КИммануил Кантпропущено... заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал.И кстати нет, естественно, что имелся ввиду класс-потомок от DbContext, содержащий схему конкретной БД. А это уже прикладной код, в отличии от IDbConnection, ISession и т. п. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 06:24 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttskyANAпропущено... И какое покрытие у таких тестов? И сколько по времени они выполняются? Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании .Местные авторитеты собрались, посовещались и вынесли решение? Браво! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 06:27 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ViPRoshVostt, во каша в башке :) сервис, бизнес логика :) сервис - это просто сервис, услуга, которую оказывает сервер, прислуга бизнес- логика - это просто логика взаимодействия клиентов(тоже могут быть сервисами) и сервисов для достижения целей внесистемных клиентов главное найти первого внесистемного клиента если ты сервис, дальше сама пойдет :) Какая каша? Объясни тогда по-другому, потому что я пока не понял из твоих слов что есть что. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КМестные авторитеты собрались, посовещались и вынесли решение? Браво! Не путай решение с выводами ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КEF в частности, разрушил всю концепцию репозитариев С какого он его разрушил? Репозиторий -- абстракция над способом хранения данных, EF это ORM к SQL базе данных (до 7 версии), это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация. Мда..... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:16 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt... это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация. ViPRos прав, у тебя каша в голове. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:36 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КhVostt... это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация. ViPRos прав, у тебя каша в голове. Аргументируй. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:48 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КИммануил Кантпропущено... заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал. Но в определении написано именно то, что там написано. Я подхожу в данном случае чисто с формальной точки зрения, проклятый LINQ-2-SQL, и EF в частности, разрушил всю концепцию репозитариев. А теперь расскажи, где разрушили? Это ORM от слова Mapping. А теперь перечитай описание шаблона репозиторий и найди, где mapping там. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:55 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttskyANAпропущено... И какое покрытие у таких тестов? И сколько по времени они выполняются? Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании. С чего ты взял, что путает? Скорее он просто не пишет модульные тесты. И наверняка считает, что им в проекте этого не надо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:01 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAИ наверняка считает, что им в проекте этого не надо :)Тебе-то виднее, что мне в проекте надо, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:07 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttАртем GСервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы. Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее... Я бы не сказал, что сервис -- это бизнес-логика. ... Бизнес-логика, это и есть совокупность всех различных сервисов. ИМХО часть бизнес-логики - это тоже бизнес-логика. :) Да, можно нарисовать граф, части которого обвести большими кругами... Но давайте быть проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:10 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAИ наверняка считает, что им в проекте этого не надо :)Тебе-то виднее, что мне в проекте надо, да? Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:12 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GskyANAСервис - это бизнес-логика . Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий). Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :) Сервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы. Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее... Я начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций. Потому как отклонения череваты ))) ... А каков функционал проекта (основной)? Неужели искать первую попавшуюся блокированную или нет категорию? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:19 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Тебе-то виднее, что мне в проекте надо, да? Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении."Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз. Я просто не мог молча пройти мимо и не прокомментировать это. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:20 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении."Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз. Я просто не мог молча пройти мимо и не прокомментировать это. :-) А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:23 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAИМХО часть бизнес-логики - это тоже бизнес-логика. :) Я к тому, что некоторые считают, что сервис-классы это и есть бизнес-логика. В некоторых проектах, видел, такие классы и вовсе называют типа SomeLogic, что в общем-то неплохо, гораздо лучше, чем логика в презентационной инфраструктуре. skyANAДа, можно нарисовать граф, части которого обвести большими кругами... Но давайте быть проще. Ну проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:25 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос. Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:35 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttНу проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении.Браво! Нобелевскую! Ты первый, кто до этого додумался! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:38 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... "Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз. Я просто не мог молча пройти мимо и не прокомментировать это. :-) А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :)Я тебе сообщаю, как я тебя понял, и всего-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:40 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :)Я тебе сообщаю, как я тебя понял, и всего-то. А мне любопытно, почему ты понял меня не правильно, приписал мне левые выводы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:45 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Я тебе сообщаю, как я тебя понял, и всего-то. А мне любопытно, почему ты понял меня не правильно, приписал мне левые выводы :)Мне надоело упражняться в красноречии, я лучше пойду. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:01 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КhVosttНу проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении.Браво! Нобелевскую! Ты первый, кто до этого додумался! Алексей КМне надоело упражняться в красноречии, я лучше пойду. Удачи! Упражняться надо не в красноречии, а в разработке, изучать тему, повышать профессионализм. Если тебе это не надо, зачем тогда лезть в дискуссии с нелепыми и глупыми высказываниями, без единой аргументации? Красноречие не поможет, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:24 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAhVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос. Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте". Тут как в присказке: сказал А, говори Б. Надо сначала разобраться что понимается под «слоем Service». Прикладной код не должен иметь прямого доступа к репозиторию. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:26 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttskyANAhVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос. Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте". Надо сначала разобраться что понимается под «слоем Service». Для этого было в начале выложен примеры кода - клиента, сервиса и репозитория, которые гуляют по интернету. Всем спасибо. Много интересных коментариев. По поводу выноса логики из вью, контроллеров итд ... с этим понятно. И с тем что нет условно одного правильного решения для всех случаев жизни. И вопрос не как правильно, а как правильнее ... Ну и да, смотря на пример выше я нивижу сервис каким то "пустым" чтоли... но как объяснили выше он может содержать в себе более 2х репозиториев, транзакции итд... И тут у меня возникает еще один вопрос. Сервис имеет в себе репозиторий UserRepository с методом GetUser. Я получаю User'a и его Roles. Правильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 11:06 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GПравильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository? это чисто прикладное решение которое полностью за вами. можно и так и сяк ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 11:57 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GИ тут у меня возникает еще один вопрос. Сервис имеет в себе репозиторий UserRepository с методом GetUser. Я получаю User'a и его Roles. Правильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository? Правильнее так, lazy load это фишка EF, а по сути ни что иное, как костыль! Сейчас тебе понадобилась просто ленивая загрузка данных через навигационные поля. А потом тебе понадобится фильтрация этих данных... и начались проблемы. В общем, тяни данные только непосредственно из репозитория, навигационные поля используй для проекции и для записи/сохранения. Этим ты убережёшь себя и других разработчиков от огромной кучи проблем на будущее. И это правильно. Обязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 13:34 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь. хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 14:17 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G Код: c# 1. 2. 3. 4. 5. 6.
Господа, я дико извиняюсь, но кто такой viewModelGadgets? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 14:49 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВГоспода, я дико извиняюсь, но кто такой viewModel Gadgets? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 14:50 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленин, Где определение выше по коду? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 15:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВВладимир Путин-Ленин, Где определение выше по коду? ну оно не в коде выше, видно в другом месте. если честно, не совсем вопрос понял ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 15:04 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленин, Смотри первый вопрос! По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту? А пихает неопознанный viewModelGadgets! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 15:26 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GhVosttпропущено... Надо сначала разобраться что понимается под «слоем Service». Для этого было в начале выложен примеры кода - клиента, сервиса и репозитория, которые гуляют по интернету. В интернете подробно расписано, что такое репозиторий, зачем появился, как использовать, как не использовать... А Вы притащили сюда какой-то кривой пример, фиг знает кем писаный. Вы лучше о своём проекте расскажите подробнее, будут более конкретные советы по его архитектуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 15:30 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВВладимир Путин-Ленин, Смотри первый вопрос! По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту? А пихает неопознанный viewModelGadgets! ну, наверное опечатка ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 15:30 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинЕвгенийВВладимир Путин-Ленин, Смотри первый вопрос! По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту? А пихает неопознанный viewModelGadgets! ну, наверное опечатка Опечатка. Код был взять из проекта с GitHube и редактировался на форуме ... убиралось лишнее. оставлял только суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 19:34 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAВы лучше о своём проекте расскажите подробнее, будут более конкретные советы по его архитектуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 22:21 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
кто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 22:53 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Roman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе а к этому "чем угодно" он будет обращаться прямо? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 22:56 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Roman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе Вообще не должен. Сервис это некая универсальная концепция некой инкапсулированной работы, выраженная в дотнете интерфейсом и его реализующим классом, а в тестах подделкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 22:58 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил КантRoman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе а к этому "чем угодно" он будет обращаться прямо? Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 22:59 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttИммануил Кантпропущено... а к этому "чем угодно" он будет обращаться прямо? Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler. если выделили этот слой. то данные только из репо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 23:01 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил КантhVosttпропущено... Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler. если выделили этот слой. то данные только из репо. или ты имеешь ввиду некоторый "вход"? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 23:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
типа Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 23:05 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь. Продублирую еще раз вопрос, так как видно потерялся :) хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 22:36 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GhVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь. Продублирую еще раз вопрос, так как видно потерялся :) хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx Да, об этом. Ещё можно воспользоваться вот этим: https://github.com/AutoMapper/AutoMapper/wiki/Projection ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 23:11 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Просмотрел кучу инет страниц об UnitOfWork. Оказалась каждый делает как ему в голову стукнет. Вариантов с десяток. И появилось еще несколько вопросов ... как будет правильнее / лучше ... 1. Передав UnitOfWork в сервис (пример в спойлере), нужно ли передовать еще и Репозиторий IApplicationRepository? Видел вариант где в конструктор Сервиса передавался и IApplicationRepository и UnitOfWork. Запросы делались через IApplicationRepository а у UnitOfWork использовался только метод SaveChanges. Но мне кажется что передавать еще и IApplicationRepository излишне. 2. Видел вариант где в Сервисе в конструкторе передается IReposritory<Application> а не IApplicationRepository, а ApplicationRepository и его методы статичны и расширяют IReposritory<Application>. Это нормально? или Правильно? Сейчас у меня в IUnitOfWork IApplicationRepository, а не IReposritory<Application> можно увидет в примере ниже, иначе я не имею доступ к методу GetApplications(Blocked: blocked), который в IApplicationRepository. 3. Транзакции делаются в Сервисе через TransactionScope? или есть другие варианты? для примера с DbContextTransaction? Помниться у меня был какой-то негативный опыт с TransactionScope. Какой, не помню. Пример ApplicationService Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Пример UnitOfWork Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 03:06 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GПросмотрел кучу инет страниц об UnitOfWork что DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 11:45 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G, Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок. Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия. Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 13:42 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил Кантчто DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 13:44 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G Код: c# 1. 2. 3. 4. 5.
И где Вы такие странные примеры находите? Смотрим Фаулера : Смотрим MSDN : Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Смотрим пример реализации на их основе . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 13:55 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANA, А не где нельзя увидеть реализацию методов и их применение ? По ссылкам этого нет ( В инете ни чего подобного не встречал... Может Вы можете поделиться ссылкой на удачную статью / пример? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2016, 00:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Пожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке Там второй пример для EF. Это реализовано по Фаулеру? Смущает класс ContextFactory, который содержит следующую строчку Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2016, 00:27 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GПожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке Там второй пример для EF. Это реализовано по Фаулеру? Смущает класс ContextFactory, который содержит следующую строчку Код: c# 1.
какая-то бесполезная прослойка ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2016, 17:30 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАртем G Код: c# 1. 2. 3. 4. 5.
И где Вы такие странные примеры находите? Смотрим Фаулера : Смотрим MSDN : Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Смотрим пример реализации на их основе . при такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 01:09 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем Gпри такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?С чего Вы это взяли? Вы так и не поняли для чего нужен Repository, а для чего UnitOfWork? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:05 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext. Почему это не будет? Для каждой атомарной команды будет одна неявная транзакция. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:28 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАртем Gпри такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?С чего Вы это взяли? Вы так и не поняли для чего нужен Repository, а для чего UnitOfWork? Я пытаюсь разобраться... вариантов в интернете с десяток ... разобраться какие из них наиболее верные нужно положить 1 человеку кучу сил / времени. Я 1. Мне не кому подсказать. Единственное место - это вот этот форум. Далее по проблеме. Спорить с Мартином я не буду. Говорит что нужно так значит так. Смотрю на UML Мартина и начинаю гуглить реализацию. Единственное на что наткнулся вот на эту статью: линк . Она ближе всех. В спойлерах тоже самое что по линку, но на моем проекте. 1 При таком вот подходе смысл иметь add, edit, remove в репозитории отпадает напрочь. 2. Нужны Ваши коментарии, что ни так. 3. Мне бы боевой пример на одном классе ... потому как сам я до пенсии правильного решения не найду (( Service Код: 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.
UoW Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 12:54 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttАртем G, Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок. Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия. Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые. hVostt, посмотрите пожалуйста, то что у меня под спойлерами в предыдущем посте. Сейчас у меня в примере UoW не содержит репозиториев, а в Service видно как используется репозиторий и UoW. Я был бы очень признателен если бы Вы ответили в правильном ли я направлении двигаюсь + любые замечания приветствуются :). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 18:42 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G, Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают. P. S. нафига очищать листы в Rollback? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 21:02 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВАртем G, Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают. P. S. нафига очищать листы в Rollback? В сервисе заполняется registredNew Код: c# 1. 2.
Код: c# 1. 2. 3. 4.
Код: c# 1.
Если коммит то Код: c# 1. 2.
Если эксепшен то список registredNew чистится. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 21:42 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GЕсли эксепшен то список registredNew чистится. И потом используется еще раз? А если не exeption то не чистится и используется еще раз? Чем это отличается от добавления просто в dbContext.Entry? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 21:55 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВАртем GЕсли эксепшен то список registredNew чистится. И потом используется еще раз? А если не exeption то не чистится и используется еще раз? Чем это отличается от добавления просто в dbContext.Entry? Да согласен, можно списки убрать. Нужно будет подумать только как делать RollBack. Вот видете даже в простых вещах выложено не продуманно / криво. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 00:41 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GНужно будет подумать только как делать RollBack. Код: c# 1. 2. 3. 4.
зы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:26 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Или так: Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:27 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо? 1. Для тестирования 2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных) 3. Для расширения (между EF и репой можно организовать свой слой умного кеша) 4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки 5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper 6. Для масштабирования Но для простых приложений на уровне лабораторных работ с одним разработчиком, можно использовать EF напрямую, и не задумываться об архитектуре. Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:52 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVosttАлексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо? 1. Для тестирования 2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных) 3. Для расширения (между EF и репой можно организовать свой слой умного кеша) 4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки 5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper 6. Для масштабирования Но для простых приложений на уровне лабораторных работ с одним разработчиком, можно использовать EF напрямую, и не задумываться об архитектуре. Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд.Да ты "Эффективный архитектор 80 LVL", не меньше! А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:32 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КДа ты "Эффективный архитектор 80 LVL", не меньше! А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее. Любую архитектурную проблему можно решить введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоев! (С) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:47 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:31 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей Кв простой и прозрачной архитектуре буттон_клик? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:31 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВhVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга. а потом написать самодельный ОРМ, который потом заменить на нормальный. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:33 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинАлексей Кв простой и прозрачной архитектуре буттон_клик?Да, если нет причин для усложнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:40 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КВладимир Путин-Ленинпропущено... буттон_клик?Да, если нет причин для усложнения. А какие есть причины для усложнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:43 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Да, если нет причин для усложнения. А какие есть причины для усложнения?См. "выделение класса" по Фаулеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:45 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то. А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:46 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А какие есть причины для усложнения?См. "выделение класса" по Фаулеру. :) Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:49 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANA Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом. Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:54 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом. Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза. откуда информация? есть ссылка? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:56 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинЕвгенийВпропущено... Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга. а потом написать самодельный ОРМ, который потом заменить на нормальный. Ну эт когда докупят 100500 топовых серверов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:57 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВВладимир Путин-Лениноткуда информация? есть ссылка? Есть. Не используют Dependency-Injection и IoC контейнеры. В коде практически всё построено на базе статических методов и классов. Аргументация - простота и улучшенная производительность. (Я бы сказал, что изначально без преимуществ ООП код строился и выработался стиль разработки, который менять теперь никто не хочет; безобразно, но однообразно .) что-то как-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:24 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом. Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза. А при чём тут проектирование? Репозиторий перестаёт быть репозиторием, если его создавать через new? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:29 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинЕвгенийВпропущено... Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза. откуда информация? есть ссылка? Они сами про это рассказывают на конференциях. Как профилировали память и увидели какой трафик пораждают DI контейнеры. Также они не пишут тестов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:31 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
А ещё можно посмотреть на ozon.ru, что был монолитным приложением и когда стало плохо, то распилили его на сервисы по аналогии с амазоном и получили профит. И подумать, а хотите-ли вы идти по такому пути: сначала накопить кучу технического долга, а потом ударно его отдавать, или может лучше воспользоваться чужим опытом и проектировать до, а не рефакторить после? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:35 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленин Не используют Dependency-Injection и IoC контейнеры. В коде практически всё построено на базе статических методов и классов. Аргументация - простота и улучшенная производительность. (Я бы сказал, что изначально без преимуществ ООП код строился и выработался стиль разработки, который менять теперь никто не хочет; безобразно, но однообразно .) что-то как-то... Это личное мнение автора статьи, в скобках. Ребята просто взяли, сели и сделали нужный, масштабируемый и высоко-нагруженный ресурс, на котором все страницы доступны всем и который не теряет производительности когда заходит гуглебот. P. S. Вот ей Богу, как Симон и Борода в той серии критиковали рейтинг Moody`s :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 14:13 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAТакже они не пишут тестов. Правильно делают! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 14:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КИли так: Код: c# 1. 2. 3. 4. 5.
Ой, спасибо. Оригинально. Я бы вот сходу наверное бы не додумался ). Читаю, пишу, читаю ... взгляд на все сейчас затуманен ... ))) А в целом UOW выглядит так как задумывалось Фаулером? Это была его идея? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 15:47 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВskyANAТакже они не пишут тестов. Правильно делают! У них процесс тестирования по другому выстроен :) Тупо не писать тесты - это ни фига не правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 16:17 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAУ них процесс тестирования по другому выстроен :) Как? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 17:20 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВskyANAУ них процесс тестирования по другому выстроен :) Как? наверное, когда баги находят пользователи. сайт то для программистов :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 18:05 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил КантЕвгенийВпропущено... Как? наверное, когда баги находят пользователи. сайт то для программистов :) примерно так :) сайт, где они находятся, не основной ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2016, 11:26 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
hVostt3. Для расширения (между EF и репой можно организовать свой слой умного кеша) спрошу здесь. у меня такая задача: 1. ASP.NET MVC-приложение - просто сайт для отображения данных. 2. Б о льшая часть данных - это некоторый архив, который желательно кешировать. Но есть данные, которые не архив, они меняются, и всегда должны показываться актуальными, задержка актуальности не допустима. 3. есть простой признак, как определить "архив/не архив" собственно вопрос: как лучше организовать кеширование, максимально используя стандартные средства, не изобретая никаких собственных велосипедов (некоторые запросы тяжелые, много всяких агрегаций/вычислений)? сам сейчас сделал так: для тяжелых запросов из архива сделал матвью, в сервисах на основе п.3 вызываю репо который либо для архива, либо для актуальных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2016, 19:28 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Иммануил Кант(некоторые запросы тяжелые, много всяких агрегаций/вычислений)? Подобные проблемы решаются добавлением избыточности. Например есть документ с табличной частью где построчно считается сумма (цена * количество) и есть сумма по документу. Чтобы не считать каждый раз сумму документа (сумма цена * количество всех строк) добавляют в шапку избыточное поле сумма. При каждом изменении пересчитывают, например в триггере. Точно также можно хранить любые расчетные параметры и обновлять при каждом изменении исходных данных. Т.е. вычислительная нагрузка во времени распределяется между вводом данных и запросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2016, 19:40 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAСервис - это бизнес-логика . Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий). Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :) Вот тут созрел вопрос. Интересно как бы Вы реализовали. Есть Stage (один) и Step (ко многим) в базе. При создании Step на странице сайта нужно выбрать Stage из DropDownList. Вот модель Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вот контроллер Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Видно что какая-то часть логики в контроллере. Вы бы оставили все как есть в контроллере или перенесли бы это в логику? PS. Сейчас у меня все это в контроллере, есть желание перенести в логику, но тогда придется менять DTO Step в бизнес логике, добавив IEnumerable<Stage>. Напомню что Stage (один) и Step (ко многим) в базе и не логично как-то в DTO Step иметь IEnumerable<Stage>. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 22:12 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом. Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 05:16 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то. А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным.Таки не нужно сравнивать суровую бизнес-аналитику и миллионы запросов со сложностью, сопоставимой с поиском в хэш-таблице - в обоих случаях свои сложности и тонкие места. skyANAАлексей Кпропущено... См. "выделение класса" по Фаулеру. :) Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.Но какое это имеет отношение к "буттон_клик"? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 05:39 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КЕвгенийВпропущено... Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода. Что же ты не приехал на Highload++ 2015 и не поведал им об этом? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:15 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то. А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным.Таки не нужно сравнивать суровую бизнес-аналитику и миллионы запросов со сложностью, сопоставимой с поиском в хэш-таблице - в обоих случаях свои сложности и тонкие места. skyANAпропущено... :) Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.Но какое это имеет отношение к "буттон_клик"? :-) Типа стрелки перевёл на ТСа? :) Кросавчег! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:17 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
И да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:27 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода. Что же ты не приехал на Highload++ 2015 и не поведал им об этом? :)Они и без меня должны это знать. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:34 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
skyANAИ да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы.Веб-запросы могут использовать результаты "суровой аналитики", выполняемой "на лету" по оперативным данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:36 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем G[src C#] public class StepViewModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [StringLength(100)] public string Name { get; set; } [Column(TypeName = "ntext")] public string Goal { get; set; } [Column(TypeName = "ntext")] public string Description { get; set; } public int StageId { get; set; } public StageViewModel Stage { get; set; } public IEnumerable<StageViewModel> StageDropDownListItems { get; set; } // здесь отличие от db и dto классов } В топку ntext! nvarchar(max) нужно использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 10:49 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
ЕвгенийВАртем G[src C#] public class StepViewModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [StringLength(100)] public string Name { get; set; } [Column(TypeName = "ntext")] public string Goal { get; set; } [Column(TypeName = "ntext")] public string Description { get; set; } public int StageId { get; set; } public StageViewModel Stage { get; set; } public IEnumerable<StageViewModel> StageDropDownListItems { get; set; } // здесь отличие от db и dto классов } В топку ntext! nvarchar(max) нужно использовать. спасибо. понял. погуглю о причинах. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 12:12 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Алексей КskyANAИ да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы.Веб-запросы могут использовать результаты "суровой аналитики", выполняемой "на лету" по оперативным данным. К чему это ты? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 16:14 |
|
Repository & Service
|
|||
---|---|---|---|
#18+
Артем GskyANAСервис - это бизнес-логика . Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий). Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :) Вот тут созрел вопрос. Интересно как бы Вы реализовали. Есть Stage (один) и Step (ко многим) в базе. При создании Step на странице сайта нужно выбрать Stage из DropDownList. Вот модель Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вот контроллер Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Видно что какая-то часть логики в контроллере. Вы бы оставили все как есть в контроллере или перенесли бы это в логику? PS. Сейчас у меня все это в контроллере, есть желание перенести в логику, но тогда придется менять DTO Step в бизнес логике, добавив IEnumerable<Stage>. Напомню что Stage (один) и Step (ко многим) в базе и не логично как-то в DTO Step иметь IEnumerable<Stage>. Заранее спасибо. "выбрать Stage из DropDownList" к логике не имеет никакого отношения. Это некое UI решение. Отображение модели (Model) на модель представления (ViewModel) я бы вынес в отдельный класс, назовём его Converter, или Formatter, или Mapper, и было бы как-то так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 16:21 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1400730]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
163ms |
get tp. blocked users: |
2ms |
others: | 286ms |
total: | 544ms |
0 / 0 |