powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Repository & Service
133 сообщений из 133, показаны все 6 страниц
Repository & Service
    #39185092
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, извеняюсь за нубские вопросы... но
Вот в интернетах пишут что репозитории занимаются тем что общаются с базой данных
А в Сервисах находиться бизнес логика. Далее показывают пример (можно увидеть ниже).
Это только у меня ощущение что бизнес логика в этом примере в репозитории?
Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте.

Прокоментируйте пожалуйста...

Repository
Код: c#
1.
2.
3.
4.
5.
6.
        public Category GetCategory(bool Blocked)
        {
            var category = this.DbContext.Categories.Where(c => c.Blocked == Blocked).FirstOrDefault();

            return category;
        }


Service
Код: c#
1.
2.
3.
4.
5.
        public Category GetCategory(bool Blocked)
        {
            var category = categorysRepository.GetCategory(Blocked: false);
            return category;
        }


Client
Код: c#
1.
2.
3.
4.
5.
6.
        public ActionResult Index()
        {
            var category = categoryService.GetCategory(false);
            var modelCategoryViewModel = Mapper.Map<Category, CategoryViewModel>(category);
            return View(viewModelGadgets);
        }
...
Рейтинг: 0 / 0
Repository & Service
    #39185117
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все норм
...
Рейтинг: 0 / 0
Repository & Service
    #39185121
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример очень не показательный. наверняка, при сохранении удалении будет куча проверок - вот они и есть "бизнес-логика"
...
Рейтинг: 0 / 0
Repository & Service
    #39185124
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем в методах сервиса будет использоваться много репозиториев, код многих будет выполняться в транзакции
...
Рейтинг: 0 / 0
Repository & Service
    #39185126
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но даже в таком виде профит имеется - можно тестировать
...
Рейтинг: 0 / 0
Repository & Service
    #39185139
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЗачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте.Ощущение правильное, потому что в качестве репозитория выступает DbContext.

авторПаттерн Repository посредничает между слоем области определения и слоем распределения данных, работая, как обычная колекция объектов области определения. Объекты-клиенты создают описание запроса декларативно и направляют их к объекту-репозиторию (Repository) для обработки. Объекты могут быть добавлены или удалены из репозитория, как будто они формируют простую коллекцию объектов . А код распределения данных, скрытый в объекте Repository, позаботится о соответсвующих операциях в незаметно для разработчика. В двух словах, паттерн Repository инкапсулирует объекты, представленыые в хранилище данных и операции, производимые над ними, предоставляя более объектно-ориентированное представление реальных данных .
...
Рейтинг: 0 / 0
Repository & Service
    #39185147
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленинно даже в таком виде профит имеется - можно тестироватьЕсть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД.
...
Рейтинг: 0 / 0
Repository & Service
    #39185178
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ммм, вот всегда так )
Владимир Путин-Ленин говорит что так и надо и это "классика" ))
а Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...

PS
Ок понял что в сервисах проверки на нуль и прочии проверки... А это не размазывает логику между Сервисом и Репозиторием?
Или нужно просто для себя запомнить что все условия для запросов находятся в репозитории?

Вот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи ... можете привести какой нибудь пример? (не код, на словах) для того, чтобы понимать о чем речь.

PSS
транзакции в коде пока не реализовал, но планирую ... нужно будет показать что в итоге получиться

Спасибо за Вашу помощь.
...
Рейтинг: 0 / 0
Repository & Service
    #39185187
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gа Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...Я не это имел ввиду. :-)

Я лишь обратил внимание на то, что под классическое определение понятия "паттерн репозитарий" попадает DbContext. А какие слои организовывать и как распределять между ними логику - это личное дело каждого, в зависимости от решаемой задачи и предпочтений.
...
Рейтинг: 0 / 0
Repository & Service
    #39185295
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КАртем Gа Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...Я не это имел ввиду. :-)

Ок, понял. Если что извеняюсь ... я утрировал ...
...
Рейтинг: 0 / 0
Repository & Service
    #39185316
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в примере видно что в Repository есть класс Category из слоя Domain

вопрос: в слое Service должен быть отдельно созданый класс Category или используется класс из слоя Domain ?

Я "продублировал" класс Category в Service и воспользовался AutoMapper ом
...
Рейтинг: 0 / 0
Repository & Service
    #39185318
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ккачестве репозитория выступает DbContext

ну да, ну да. а если не он?
...
Рейтинг: 0 / 0
Repository & Service
    #39185319
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВладимир Путин-Ленинно даже в таком виде профит имеется - можно тестироватьЕсть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД.
И какое покрытие у таких тестов? И сколько по времени они выполняются?
...
Рейтинг: 0 / 0
Repository & Service
    #39185320
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кбанально, подключить тесты к тестовой БД

это, конечно, тоже надо. но, что будет тестироваться в итоге, если нет разделения? полный чОрный ящик? это хрень а не тестирование
...
Рейтинг: 0 / 0
Repository & Service
    #39185321
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gммм, вот всегда так )
Владимир Путин-Ленин говорит что так и надо и это "классика" ))
а Алексей К говорит что ну их нах Сервисы можно в клиент репозитории...

PS
Ок понял что в сервисах проверки на нуль и прочии проверки... А это не размазывает логику между Сервисом и Репозиторием?
Или нужно просто для себя запомнить что все условия для запросов находятся в репозитории?

Вот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи ... можете привести какой нибудь пример? (не код, на словах) для того, чтобы понимать о чем речь.

PSS
транзакции в коде пока не реализовал, но планирую ... нужно будет показать что в итоге получиться

Спасибо за Вашу помощь.
Сервис - это бизнес-логика .

Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий).

Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185325
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GВот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи

ну представь, что для выполнения удаления, тебе надо сначала спросить а не "лайка бос" ли объект. а этот запрос делает другой репо. вот и их уже > 1
...
Рейтинг: 0 / 0
Repository & Service
    #39185327
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленинно даже в таком виде профит имеется - можно тестировать
И не только тестировать... Можно прозрачно сменить хранилище, можно прозрачно подключить распределённый кэш, можно прозрачно вынести базу в другую зону в целях безопасности и работать с ней через API...
...
Рейтинг: 0 / 0
Repository & Service
    #39185329
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GВот как использовать 2 и более репозиториев в сервисе не вижу для себя задачи
Ну к примеру пересчитать заказ в другую валюту. Где будете это делать? В контроллере? :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185332
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ккачестве репозитория выступает DbContext

заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы... если вообще не стоит задача распределить и тестировать логику, допустим это один сайт, то может и не надо так заморачиваться сейчас.
...
Рейтинг: 0 / 0
Repository & Service
    #39185342
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G
Код: c#
1.
(bool  Blocked)



для придирки: локальные переменные и параметры вроде принято с маленькой буквы
...
Рейтинг: 0 / 0
Repository & Service
    #39185356
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAСервис - это бизнес-логика .

Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий).

Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :)

Сервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы.
Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее...

Я начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций.
Потому как отклонения череваты ))) ...

Иммануил КантАртем G
Код: c#
1.
(bool  Blocked)


для придирки: локальные переменные и параметры вроде принято с маленькой буквы

Да, вы правы.
...
Рейтинг: 0 / 0
Repository & Service
    #39185366
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЯ начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций

начни писать тесты. и все станет ясно. слабосвязанная архитектура не для красоты.
...
Рейтинг: 0 / 0
Repository & Service
    #39185367
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЯ начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций.
Потому как отклонения череваты ))) ...
Суть сервиса в том, что из него можно дергать данные из разных репозиториев, обрабатывать в соответстии с бизнес логикой и отправлять результаты обратно в репозитории. Это частный пример.

Например:
Код: c#
1.
2.
3.
4.
5.
6.
        public void BlockProductsByCategory(int categoryId)
        {
            var category = categorysRepository.GetCategoryById(categoryId);
            var products = productsRepository.GetProductsByCategory(category);
            // код блокировки продуктов;
        }
...
Рейтинг: 0 / 0
Repository & Service
    #39185370
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gощущение что бизнес логика в этом примере в репозитории

если есть динамика в критериях выборки, то такие репозитории не годятся
...
Рейтинг: 0 / 0
Repository & Service
    #39185468
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Есть и другие способы организовать тестирование: банально, подключить тесты к тестовой БД.
И какое покрытие у таких тестов? И сколько по времени они выполняются?

Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании.
...
Рейтинг: 0 / 0
Repository & Service
    #39185472
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GСервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы.
Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее...

Я бы не сказал, что сервис -- это бизнес-логика. Сервис, это сервис. Бизнес-логика, это код, который непосредственно решает задачи бизнеса, а именно: комплексные операции обработки и сохранения данных, включая проверку доступа, валидацию, операционные эффекты, генерацию сообщений, вычисления, и прочее... Т.е. всё то, для чего приложение разрабатывается.

Часто бизнес-логику размазывают, особенно по контроллерам, из-за непонимания где такую логику разместить. Сервисы -- это классы, предоставляющие определённые услуги.

Например, сервис данных обеспечивает прикладной код необходимыми данными. Сервис доставки сообщений обеспечивает эту доставку и всё что прилагается. И т.д.

Бизнес-логика, это и есть совокупность всех различных сервисов. Но не всегда архитектура строится на сервисах, есть и другие подходы, которые практически полностью исключают необходимость создания сервис-классов.

Ну а к твоему вопросу, на самом деле ответить нельзя, пока не будет условия задачи. Если приложение представляет собой сохранялку-показывалку данных, то вся логика уместится в дата-сервисах с методами Дай() и Положи() грубо говоря.

В целом, из инфраструктуры презентации (контроллер, презентер, вью...) необходимо выкашивать всю бизнес-логику по максимуму. А как ты это будешь делать зависит целиком и полностью от задач. Нет какой-то универсальной архитектуры и правильного разбиения по слоям.

При прототипировании, например, вполне уместно работать прям с DbContext-ом, и прям в контроллерах. Но в серьёзных проектах умные адекватные дядьки, конечно, так делать никогда не будут
...
Рейтинг: 0 / 0
Repository & Service
    #39185489
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

во каша в башке :)
сервис, бизнес логика :)
сервис - это просто сервис, услуга, которую оказывает сервер, прислуга
бизнес- логика - это просто логика взаимодействия клиентов(тоже могут быть сервисами) и сервисов для достижения целей внесистемных клиентов
главное найти первого внесистемного клиента если ты сервис, дальше сама пойдет :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185514
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЗачем вообще слой Service?Service - это совокупность репозиториев.
...
Рейтинг: 0 / 0
Repository & Service
    #39185527
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил КантАлексей Ккачестве репозитория выступает DbContext

заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал. Но в определении написано именно то, что там написано. Я подхожу в данном случае чисто с формальной точки зрения, проклятый LINQ-2-SQL, и EF в частности, разрушил всю концепцию репозитариев.
...
Рейтинг: 0 / 0
Repository & Service
    #39185530
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИммануил Кантпропущено...


заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал.И кстати нет, естественно, что имелся ввиду класс-потомок от DbContext, содержащий схему конкретной БД. А это уже прикладной код, в отличии от IDbConnection, ISession и т. п.
...
Рейтинг: 0 / 0
Repository & Service
    #39185533
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...

И какое покрытие у таких тестов? И сколько по времени они выполняются?

Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании .Местные авторитеты собрались, посовещались и вынесли решение? Браво!
...
Рейтинг: 0 / 0
Repository & Service
    #39185552
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

во каша в башке :)
сервис, бизнес логика :)
сервис - это просто сервис, услуга, которую оказывает сервер, прислуга
бизнес- логика - это просто логика взаимодействия клиентов(тоже могут быть сервисами) и сервисов для достижения целей внесистемных клиентов
главное найти первого внесистемного клиента если ты сервис, дальше сама пойдет :)

Какая каша? Объясни тогда по-другому, потому что я пока не понял из твоих слов что есть что.
...
Рейтинг: 0 / 0
Repository & Service
    #39185553
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМестные авторитеты собрались, посовещались и вынесли решение? Браво!

Не путай решение с выводами
...
Рейтинг: 0 / 0
Repository & Service
    #39185554
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КEF в частности, разрушил всю концепцию репозитариев

С какого он его разрушил? Репозиторий -- абстракция над способом хранения данных, EF это ORM к SQL базе данных (до 7 версии), это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация.

Мда.....
...
Рейтинг: 0 / 0
Repository & Service
    #39185560
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt... это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация. ViPRos прав, у тебя каша в голове.
...
Рейтинг: 0 / 0
Repository & Service
    #39185564
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt... это ни разу не абстракция и ни разу не репозиторий, а скорее его реализация. ViPRos прав, у тебя каша в голове.

Аргументируй.
...
Рейтинг: 0 / 0
Repository & Service
    #39185568
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИммануил Кантпропущено...


заблуждение, я считаю. это не репо, это ниже: ISession, DbContext, IDbConnection, просто сохранение в файлы...Я бы тоже так считал. Но в определении написано именно то, что там написано. Я подхожу в данном случае чисто с формальной точки зрения, проклятый LINQ-2-SQL, и EF в частности, разрушил всю концепцию репозитариев.
А теперь расскажи, где разрушили?

Это ORM от слова Mapping. А теперь перечитай описание шаблона репозиторий и найди, где mapping там.
...
Рейтинг: 0 / 0
Repository & Service
    #39185576
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...

И какое покрытие у таких тестов? И сколько по времени они выполняются?

Алексей путает интеграционные тесты с модульными. Смею предположить, что из-за отсутствия опыта в тестировании.
С чего ты взял, что путает?

Скорее он просто не пишет модульные тесты. И наверняка считает, что им в проекте этого не надо :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185579
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ наверняка считает, что им в проекте этого не надо :)Тебе-то виднее, что мне в проекте надо, да?
...
Рейтинг: 0 / 0
Repository & Service
    #39185585
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАртем GСервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы.
Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее...
Я бы не сказал, что сервис -- это бизнес-логика.
...
Бизнес-логика, это и есть совокупность всех различных сервисов.
ИМХО часть бизнес-логики - это тоже бизнес-логика. :)

Да, можно нарисовать граф, части которого обвести большими кругами... Но давайте быть проще.
...
Рейтинг: 0 / 0
Repository & Service
    #39185588
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИ наверняка считает, что им в проекте этого не надо :)Тебе-то виднее, что мне в проекте надо, да?
Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении.
...
Рейтинг: 0 / 0
Repository & Service
    #39185590
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GskyANAСервис - это бизнес-логика .

Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий).

Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :)

Сервис - это бизнес логика. Все предельно ясно. Но как доходит до практики начинают возникать вопросы.
Как пример: выше я показал репозиторий и сервис. Но то, что написано в репозитории выглядит как бизнес логика, а то, что написано в сервисе выглядит как излишнее...

Я начал писать проект и хоть для меня "не понятно" в чем суть сервиса, но решил не отклоняться от рекомендаций.
Потому как отклонения череваты ))) ...
А каков функционал проекта (основной)? Неужели искать первую попавшуюся блокированную или нет категорию?
...
Рейтинг: 0 / 0
Repository & Service
    #39185591
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Тебе-то виднее, что мне в проекте надо, да?
Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении."Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз.

Я просто не мог молча пройти мимо и не прокомментировать это. :-)
...
Рейтинг: 0 / 0
Repository & Service
    #39185594
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...

Ну не будь таким Толстым занудой :) Ты же понял, что это предположение, а не утверждение, основанное на предыдущем с тобой общении."Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз.

Я просто не мог молча пройти мимо и не прокомментировать это. :-)
А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185596
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИМХО часть бизнес-логики - это тоже бизнес-логика. :)

Я к тому, что некоторые считают, что сервис-классы это и есть бизнес-логика. В некоторых проектах, видел, такие классы и вовсе называют типа SomeLogic, что в общем-то неплохо, гораздо лучше, чем логика в презентационной инфраструктуре.


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

Ну проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении.
...
Рейтинг: 0 / 0
Repository & Service
    #39185605
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос.

Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте".
...
Рейтинг: 0 / 0
Repository & Service
    #39185607
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении.Браво! Нобелевскую!

Ты первый, кто до этого додумался!
...
Рейтинг: 0 / 0
Repository & Service
    #39185608
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
"Я в своих проектах не применяю модульные тесты, поэтому я не умею их использовать" - странное предположение и не в первый раз.

Я просто не мог молча пройти мимо и не прокомментировать это. :-)
А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :)Я тебе сообщаю, как я тебя понял, и всего-то.
...
Рейтинг: 0 / 0
Repository & Service
    #39185612
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...

А к чему ты цитируешь то, что я не писал и не думал даже писать? Мнительный? :)Я тебе сообщаю, как я тебя понял, и всего-то.
А мне любопытно, почему ты понял меня не правильно, приписал мне левые выводы :)
...
Рейтинг: 0 / 0
Repository & Service
    #39185619
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Я тебе сообщаю, как я тебя понял, и всего-то.
А мне любопытно, почему ты понял меня не правильно, приписал мне левые выводы :)Мне надоело упражняться в красноречии, я лучше пойду. Удачи!
...
Рейтинг: 0 / 0
Repository & Service
    #39185637
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttНу проще и понятнее было бы логику обособлять в отдельном модуле (или в модулях), для многократного использования в различном применении.Браво! Нобелевскую!

Ты первый, кто до этого додумался!

Алексей КМне надоело упражняться в красноречии, я лучше пойду. Удачи!

Упражняться надо не в красноречии, а в разработке, изучать тему, повышать профессионализм. Если тебе это не надо, зачем тогда лезть в дискуссии с нелепыми и глупыми высказываниями, без единой аргументации? Красноречие не поможет, увы.
...
Рейтинг: 0 / 0
Repository & Service
    #39185638
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос.

Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте".

Тут как в присказке: сказал А, говори Б. Надо сначала разобраться что понимается под «слоем Service».

Прикладной код не должен иметь прямого доступа к репозиторию.
...
Рейтинг: 0 / 0
Repository & Service
    #39185701
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttskyANAhVostt, как обзывать классы, инкапсулирующие бизнес-логику, и в какие модули выносить - это отдельный вопрос.
Давай вернёмся к ТС: "Зачем вообще слой Service? Такое ощущение что вместо сервиса можно использовать сразу репозиторий в клиенте".
Надо сначала разобраться что понимается под «слоем Service».
Для этого было в начале выложен примеры кода - клиента, сервиса и репозитория, которые гуляют по интернету.

Всем спасибо. Много интересных коментариев.

По поводу выноса логики из вью, контроллеров итд ... с этим понятно. И с тем что нет условно одного правильного решения для всех случаев жизни. И вопрос не как правильно, а как правильнее ... Ну и да, смотря на пример выше я нивижу сервис каким то "пустым" чтоли... но как объяснили выше он может содержать в себе более 2х репозиториев, транзакции итд...

И тут у меня возникает еще один вопрос. Сервис имеет в себе репозиторий UserRepository с методом GetUser. Я получаю User'a и его Roles. Правильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository?
...
Рейтинг: 0 / 0
Repository & Service
    #39185798
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GПравильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository?

это чисто прикладное решение которое полностью за вами. можно и так и сяк
...
Рейтинг: 0 / 0
Repository & Service
    #39185887
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GИ тут у меня возникает еще один вопрос. Сервис имеет в себе репозиторий UserRepository с методом GetUser. Я получаю User'a и его Roles. Правильнее будет отключить LazyLoadingEnabled ? и добавить в сервис RoleRepository?

Правильнее так, lazy load это фишка EF, а по сути ни что иное, как костыль!

Сейчас тебе понадобилась просто ленивая загрузка данных через навигационные поля. А потом тебе понадобится фильтрация этих данных... и начались проблемы.

В общем, тяни данные только непосредственно из репозитория, навигационные поля используй для проекции и для записи/сохранения. Этим ты убережёшь себя и других разработчиков от огромной кучи проблем на будущее. И это правильно.

Обязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь.
...
Рейтинг: 0 / 0
Repository & Service
    #39185938
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь.
хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx
...
Рейтинг: 0 / 0
Repository & Service
    #39185971
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G
Код: c#
1.
2.
3.
4.
5.
6.
        public ActionResult Index()
        {
            var category = categoryService.GetCategory(false);
            var modelCategoryViewModel = Mapper.Map<Category, CategoryViewModel>(category);
            return View(viewModelGadgets);
        }


Господа, я дико извиняюсь, но кто такой viewModelGadgets?
...
Рейтинг: 0 / 0
Repository & Service
    #39185973
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВГоспода, я дико извиняюсь, но кто такой viewModel Gadgets?
...
Рейтинг: 0 / 0
Repository & Service
    #39185981
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленин,
Где определение выше по коду?
...
Рейтинг: 0 / 0
Repository & Service
    #39185985
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВладимир Путин-Ленин,
Где определение выше по коду?


ну оно не в коде выше, видно в другом месте. если честно, не совсем вопрос понял
...
Рейтинг: 0 / 0
Repository & Service
    #39186001
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленин,
Смотри первый вопрос!
По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту?

А пихает неопознанный viewModelGadgets!
...
Рейтинг: 0 / 0
Repository & Service
    #39186007
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GhVosttпропущено...

Надо сначала разобраться что понимается под «слоем Service».
Для этого было в начале выложен примеры кода - клиента, сервиса и репозитория, которые гуляют по интернету.
В интернете подробно расписано, что такое репозиторий, зачем появился, как использовать, как не использовать... А Вы притащили сюда какой-то кривой пример, фиг знает кем писаный.

Вы лучше о своём проекте расскажите подробнее, будут более конкретные советы по его архитектуре.
...
Рейтинг: 0 / 0
Repository & Service
    #39186008
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВладимир Путин-Ленин,
Смотри первый вопрос!
По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту?

А пихает неопознанный viewModelGadgets!

ну, наверное опечатка
...
Рейтинг: 0 / 0
Repository & Service
    #39186186
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир Путин-ЛенинЕвгенийВВладимир Путин-Ленин,
Смотри первый вопрос!
По идее он должен пихнуть был modelCategoryViewModel, иначе какой смысл получать эту мутоту?
А пихает неопознанный viewModelGadgets!
ну, наверное опечатка
Опечатка. Код был взять из проекта с GitHube и редактировался на форуме ... убиралось лишнее. оставлял только суть.
...
Рейтинг: 0 / 0
Repository & Service
    #39186251
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВы лучше о своём проекте расскажите подробнее, будут более конкретные советы по его архитектуре.

...
Рейтинг: 0 / 0
Repository & Service
    #39186255
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе
...
Рейтинг: 0 / 0
Repository & Service
    #39186256
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе

а к этому "чем угодно" он будет обращаться прямо?
...
Рейтинг: 0 / 0
Repository & Service
    #39186258
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе

Вообще не должен. Сервис это некая универсальная концепция некой инкапсулированной работы, выраженная в дотнете интерфейсом и его реализующим классом, а в тестах подделкой.
...
Рейтинг: 0 / 0
Repository & Service
    #39186259
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил КантRoman Mejtesкто вообще сказал, что сервис должен работать с репозиторием? сервис может работать с чем угодно и с репозиторием в том числе

а к этому "чем угодно" он будет обращаться прямо?

Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler.
...
Рейтинг: 0 / 0
Repository & Service
    #39186260
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИммануил Кантпропущено...


а к этому "чем угодно" он будет обращаться прямо?

Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler.


если выделили этот слой. то данные только из репо.
...
Рейтинг: 0 / 0
Repository & Service
    #39186261
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил КантhVosttпропущено...


Просто сервис может работать с данными, которые ему дадут вместо извлечения их из репозитория. Например, он может получать query handler.


если выделили этот слой. то данные только из репо.

или ты имеешь ввиду некоторый "вход"?
...
Рейтинг: 0 / 0
Repository & Service
    #39186263
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа

Код: c#
1.
2.
3.
4.
5.
void M (Some s)
{
    if (проверка(s))
       throw;
}
...
Рейтинг: 0 / 0
Repository & Service
    #39186622
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь.
Продублирую еще раз вопрос, так как видно потерялся :)
хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx
...
Рейтинг: 0 / 0
Repository & Service
    #39186647
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GhVosttОбязательно разберись с проекциями, это мощнейший инструмент, я не перестаю повторять об этом здесь.
Продублирую еще раз вопрос, так как видно потерялся :)
хм, новое слово ... это вот об этом идет речь? https://msdn.microsoft.com/ru-ru/library/bb386978(v=vs.100).aspx

Да, об этом. Ещё можно воспользоваться вот этим: https://github.com/AutoMapper/AutoMapper/wiki/Projection
...
Рейтинг: 0 / 0
Repository & Service
    #39186721
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просмотрел кучу инет страниц об 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.
    public class ApplicationService : IApplicationService
    {
        private readonly IUnitOfWork unitOfWork;
        private readonly IMapper mapper;
        public ApplicationService(IUnitOfWork unitOfWork, IMapper mapper)
        {
            this.unitOfWork = unitOfWork;
            this.mapper = mapper;
        }
        public IEnumerable<Application> GetApplications(bool blocked)
        {
            var applicationsDb = unitOfWork.ApplicationRepository.GetApplications(Blocked: blocked);  //   <--- Это корректно? Или 
            var applications = mapper.Map<IEnumerable<Application>>(applicationsDb);
            return applications;
        }
    }
}



Пример UnitOfWork
Код: c#
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IApplicationRepository ApplicationRepository { get; }
        void Commit();
    }


...
Рейтинг: 0 / 0
Repository & Service
    #39186802
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GПросмотрел кучу инет страниц об UnitOfWork

что DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее
...
Рейтинг: 0 / 0
Repository & Service
    #39186860
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,

Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок.

Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия.

Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые.
...
Рейтинг: 0 / 0
Repository & Service
    #39186862
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил Кантчто DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее

DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext.
...
Рейтинг: 0 / 0
Repository & Service
    #39186867
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G
Код: c#
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IApplicationRepository ApplicationRepository { get; }
        void Commit();
    }


И где Вы такие странные примеры находите?

Смотрим Фаулера :


Смотрим MSDN :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IUnitOfWork
{
    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);

    void Commit();
    void Rollback();
}



Смотрим пример реализации на их основе .
...
Рейтинг: 0 / 0
Repository & Service
    #39187719
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

А не где нельзя увидеть реализацию методов и их применение ? По ссылкам этого нет (
В инете ни чего подобного не встречал...
Может Вы можете поделиться ссылкой на удачную статью / пример?
...
Рейтинг: 0 / 0
Repository & Service
    #39187723
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке
Там второй пример для EF. Это реализовано по Фаулеру?
Смущает класс ContextFactory, который содержит следующую строчку
Код: c#
1.
DbContext context = HttpContext.Current.Items["CurrentContext"] as DbContext;
...
Рейтинг: 0 / 0
Repository & Service
    #39188443
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GПожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке
Там второй пример для EF. Это реализовано по Фаулеру?
Смущает класс ContextFactory, который содержит следующую строчку
Код: c#
1.
DbContext context = HttpContext.Current.Items["CurrentContext"] as DbContext;



какая-то бесполезная прослойка
...
Рейтинг: 0 / 0
Repository & Service
    #39188701
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAАртем G
Код: c#
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IApplicationRepository ApplicationRepository { get; }
        void Commit();
    }


И где Вы такие странные примеры находите?

Смотрим Фаулера :


Смотрим MSDN :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IUnitOfWork
{
    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);

    void Commit();
    void Rollback();
}



Смотрим пример реализации на их основе .

при такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?
...
Рейтинг: 0 / 0
Repository & Service
    #39188805
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gпри такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?С чего Вы это взяли? Вы так и не поняли для чего нужен Repository, а для чего UnitOfWork?
...
Рейтинг: 0 / 0
Repository & Service
    #39188874
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext.
Почему это не будет? Для каждой атомарной команды будет одна неявная транзакция.
...
Рейтинг: 0 / 0
Repository & Service
    #39188982
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
    public interface IUserService
    {
        void AddAsGuest(IIdentity Identity);
    }
    public class UserService : IUserService
    {
        private readonly IApplicationsStoreUnitOfWork unitOfWork;
        private readonly IUserRepository userRepository;
        private readonly IRoleRepository roleRepository;
        private readonly IMapper mapper;
        public UserService(IApplicationsStoreUnitOfWork unitOfWork, IUserRepository userRepository, IRoleRepository roleRepository, IMapper mapper)
        {
            this.unitOfWork = unitOfWork;
            this.userRepository = userRepository;
            this.roleRepository = roleRepository;
            this.mapper = mapper;
        }
        public void AddAsGuest(IIdentity Identity)
        {
            try
            {
                var role = roleRepository.GetRole(RoleType.Guest.ToString());
                if (role == null)
                {
                    role =  new Domain.SecurityPolicies.Role
                    {
                        Name = RoleType.Guest.ToString()
                    };
                    unitOfWork.RegisterNew(role);
                }
                var user = new Domain.SecurityPolicies.User
                {
                    FirstName = Identity.FirstName(),
                    LastName = Identity.LastName(),
                    IdentityId = Identity.IdentityId(),
                    Email = Identity.Email(),
                    Roles = new[] {role}
                };
                unitOfWork.RegisterNew(user);
                unitOfWork.Commit();
            }
            catch (Exception)
            {
                unitOfWork.Rollback();
            }
        }
    }

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.
public abstract class UnitOfWorkBase<TContext> : IUnitOfWork<TContext> where TContext : DbContext
    {
        private readonly TContext dbContext;
        private readonly List<object> registredNew = new List<object>();
        private readonly List<object> registredDirty = new List<object>();
        private readonly List<object> registredRemoved = new List<object>();
        protected UnitOfWorkBase(IContextFactory<TContext> contextFactory) : this(contextFactory.CreateDbContext())
        {
            dbContext = contextFactory.CreateDbContext();
        }
        protected UnitOfWorkBase(TContext dbContext)
        {
            this.dbContext = dbContext;
        }
        public void RegisterNew(object entity)
        {
            registredNew.Add(entity);
        }
        public void RegisterDirty(object entity)
        {
            registredDirty.Add(entity);
        }
        public void RegisterRemoved(object entity)
        {
            registredRemoved.Add(entity);
        }
        public void Commit()
        {
            using (var transaction = new TransactionScope())
            {
                foreach (var entity in registredNew)
                    dbContext.Entry(entity).State = EntityState.Added;
                foreach (var entity in registredDirty)
                    dbContext.Entry(entity).State = EntityState.Modified;
                foreach (var entity in registredRemoved)
                    dbContext.Entry(entity).State = EntityState.Deleted;
                dbContext.SaveChanges();
                transaction.Complete();
            }
        }
        public void Rollback()
        {
            registredNew.Clear();
            registredDirty.Clear();
            registredRemoved.Clear();
        }
    }


...
Рейтинг: 0 / 0
Repository & Service
    #39189389
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttАртем G,
Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок.
Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия.
Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые.
hVostt, посмотрите пожалуйста, то что у меня под спойлерами в предыдущем посте. Сейчас у меня в примере UoW не содержит репозиториев, а в Service видно как используется репозиторий и UoW. Я был бы очень признателен если бы Вы ответили в правильном ли я направлении двигаюсь + любые замечания приветствуются :).
...
Рейтинг: 0 / 0
Repository & Service
    #39189475
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,
Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают.

P. S. нафига очищать листы в Rollback?
...
Рейтинг: 0 / 0
Repository & Service
    #39189486
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВАртем G,
Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают.

P. S. нафига очищать листы в Rollback?
В сервисе заполняется registredNew
Код: c#
1.
2.
 Сервис
unitOfWork.RegisterNew(role);

Код: c#
1.
2.
3.
4.
        public void RegisterNew(object entity)
        {
            registredNew.Add(entity);
        }

Код: c#
1.
private readonly List<object> registredNew


Если коммит то
Код: c#
1.
2.
 foreach (var entity in registredNew)
                    dbContext.Entry(entity).State = EntityState.Added;


Если эксепшен то список registredNew чистится.
...
Рейтинг: 0 / 0
Repository & Service
    #39189488
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЕсли эксепшен то список registredNew чистится.
И потом используется еще раз?
А если не exeption то не чистится и используется еще раз?
Чем это отличается от добавления просто в dbContext.Entry?
...
Рейтинг: 0 / 0
Repository & Service
    #39189552
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВАртем GЕсли эксепшен то список registredNew чистится.
И потом используется еще раз?
А если не exeption то не чистится и используется еще раз?
Чем это отличается от добавления просто в dbContext.Entry?
Да согласен, можно списки убрать. Нужно будет подумать только как делать RollBack.
Вот видете даже в простых вещах выложено не продуманно / криво.
...
Рейтинг: 0 / 0
Repository & Service
    #39189639
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GНужно будет подумать только как делать RollBack.
Код: c#
1.
2.
3.
4.
public void Rollback()
{
    dbContext = contextFactory.CreateDbContext();
}



зы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?
...
Рейтинг: 0 / 0
Repository & Service
    #39189642
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:
Код: c#
1.
2.
3.
4.
5.
public void Rollback()
{
    dbContext.Dispose();
    dbContext = contextFactory.CreateDbContext();
}
...
Рейтинг: 0 / 0
Repository & Service
    #39189662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?

1. Для тестирования
2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных)
3. Для расширения (между EF и репой можно организовать свой слой умного кеша)
4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки
5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper
6. Для масштабирования

Но для простых приложений на уровне лабораторных работ с одним разработчиком, можно использовать EF напрямую, и не задумываться об архитектуре.

Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд.
...
Рейтинг: 0 / 0
Repository & Service
    #39189777
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?

1. Для тестирования
2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных)
3. Для расширения (между EF и репой можно организовать свой слой умного кеша)
4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки
5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper
6. Для масштабирования

Но для простых приложений на уровне лабораторных работ с одним разработчиком, можно использовать EF напрямую, и не задумываться об архитектуре.

Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд.Да ты "Эффективный архитектор 80 LVL", не меньше!

А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее.
...
Рейтинг: 0 / 0
Repository & Service
    #39189803
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДа ты "Эффективный архитектор 80 LVL", не меньше!

А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее.
Любую архитектурную проблему можно решить введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоев! (С)
...
Рейтинг: 0 / 0
Repository & Service
    #39189873
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper

Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга.
...
Рейтинг: 0 / 0
Repository & Service
    #39189874
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кв простой и прозрачной архитектуре

буттон_клик?
...
Рейтинг: 0 / 0
Repository & Service
    #39189877
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper

Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга.

а потом написать самодельный ОРМ, который потом заменить на нормальный.
...
Рейтинг: 0 / 0
Repository & Service
    #39189901
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинАлексей Кв простой и прозрачной архитектуре

буттон_клик?Да, если нет причин для усложнения.
...
Рейтинг: 0 / 0
Repository & Service
    #39189907
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВладимир Путин-Ленинпропущено...


буттон_клик?Да, если нет причин для усложнения.
А какие есть причины для усложнения?
...
Рейтинг: 0 / 0
Repository & Service
    #39189910
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Да, если нет причин для усложнения.
А какие есть причины для усложнения?См. "выделение класса" по Фаулеру.
...
Рейтинг: 0 / 0
Repository & Service
    #39189911
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то.

А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным.
...
Рейтинг: 0 / 0
Repository & Service
    #39189918
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...

А какие есть причины для усложнения?См. "выделение класса" по Фаулеру.
:)

Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.
...
Рейтинг: 0 / 0
Repository & Service
    #39189923
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.
Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.
...
Рейтинг: 0 / 0
Repository & Service
    #39189927
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.
Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.

откуда информация? есть ссылка?
...
Рейтинг: 0 / 0
Repository & Service
    #39189929
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинЕвгенийВпропущено...

Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга.

а потом написать самодельный ОРМ, который потом заменить на нормальный.
Ну эт когда докупят 100500 топовых серверов.
...
Рейтинг: 0 / 0
Repository & Service
    #39189947
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленин
откуда информация? есть ссылка?
Есть.
...
Рейтинг: 0 / 0
Repository & Service
    #39189973
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВладимир Путин-Лениноткуда информация? есть ссылка?
Есть.

Не используют Dependency-Injection и IoC контейнеры. В коде практически всё построено на базе статических методов и классов. Аргументация - простота и улучшенная производительность. (Я бы сказал, что изначально без преимуществ ООП код строился и выработался стиль разработки, который менять теперь никто не хочет; безобразно, но однообразно .)

что-то как-то...
...
Рейтинг: 0 / 0
Repository & Service
    #39189983
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.
Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.
А при чём тут проектирование? Репозиторий перестаёт быть репозиторием, если его создавать через new? :)
...
Рейтинг: 0 / 0
Repository & Service
    #39189986
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинЕвгенийВпропущено...

Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.

откуда информация? есть ссылка?
Они сами про это рассказывают на конференциях. Как профилировали память и увидели какой трафик пораждают DI контейнеры.
Также они не пишут тестов.
...
Рейтинг: 0 / 0
Repository & Service
    #39189998
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё можно посмотреть на ozon.ru, что был монолитным приложением и когда стало плохо, то распилили его на сервисы по аналогии с амазоном и получили профит.
И подумать, а хотите-ли вы идти по такому пути: сначала накопить кучу технического долга, а потом ударно его отдавать, или может лучше воспользоваться чужим опытом и проектировать до, а не рефакторить после?
...
Рейтинг: 0 / 0
Repository & Service
    #39190039
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленин
Не используют Dependency-Injection и IoC контейнеры. В коде практически всё построено на базе статических методов и классов. Аргументация - простота и улучшенная производительность. (Я бы сказал, что изначально без преимуществ ООП код строился и выработался стиль разработки, который менять теперь никто не хочет; безобразно, но однообразно .)

что-то как-то...
Это личное мнение автора статьи, в скобках.
Ребята просто взяли, сели и сделали нужный, масштабируемый и высоко-нагруженный ресурс, на котором все страницы доступны всем и который не теряет производительности когда заходит гуглебот.

P. S. Вот ей Богу, как Симон и Борода в той серии критиковали рейтинг Moody`s :)
...
Рейтинг: 0 / 0
Repository & Service
    #39190042
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТакже они не пишут тестов.
Правильно делают!
...
Рейтинг: 0 / 0
Repository & Service
    #39190169
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КИли так:
Код: c#
1.
2.
3.
4.
5.
public void Rollback()
{
    dbContext.Dispose();
    dbContext = contextFactory.CreateDbContext();
}


Ой, спасибо. Оригинально. Я бы вот сходу наверное бы не додумался ). Читаю, пишу, читаю ... взгляд на все сейчас затуманен ... )))
А в целом UOW выглядит так как задумывалось Фаулером? Это была его идея?
...
Рейтинг: 0 / 0
Repository & Service
    #39190205
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAТакже они не пишут тестов.
Правильно делают!
У них процесс тестирования по другому выстроен :) Тупо не писать тесты - это ни фига не правильно.
...
Рейтинг: 0 / 0
Repository & Service
    #39190300
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ них процесс тестирования по другому выстроен :)
Как?
...
Рейтинг: 0 / 0
Repository & Service
    #39190331
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAУ них процесс тестирования по другому выстроен :)
Как?

наверное, когда баги находят пользователи. сайт то для программистов :)
...
Рейтинг: 0 / 0
Repository & Service
    #39190502
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил КантЕвгенийВпропущено...

Как?

наверное, когда баги находят пользователи. сайт то для программистов :)
примерно так :) сайт, где они находятся, не основной
...
Рейтинг: 0 / 0
Repository & Service
    #39190657
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt3. Для расширения (между EF и репой можно организовать свой слой умного кеша)

спрошу здесь. у меня такая задача:
1. ASP.NET MVC-приложение - просто сайт для отображения данных.
2. Б о льшая часть данных - это некоторый архив, который желательно кешировать. Но есть данные, которые не архив, они меняются, и всегда должны показываться актуальными, задержка актуальности не допустима.
3. есть простой признак, как определить "архив/не архив"

собственно вопрос: как лучше организовать кеширование, максимально используя стандартные средства, не изобретая никаких собственных велосипедов (некоторые запросы тяжелые, много всяких агрегаций/вычислений)?

сам сейчас сделал так: для тяжелых запросов из архива сделал матвью, в сервисах на основе п.3 вызываю репо который либо для архива, либо для актуальных данных.
...
Рейтинг: 0 / 0
Repository & Service
    #39190663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил Кант(некоторые запросы тяжелые, много всяких агрегаций/вычислений)?
Подобные проблемы решаются добавлением избыточности. Например есть документ с табличной частью где построчно считается сумма (цена * количество) и есть сумма по документу. Чтобы не считать каждый раз сумму документа (сумма цена * количество всех строк) добавляют в шапку избыточное поле сумма. При каждом изменении пересчитывают, например в триггере. Точно также можно хранить любые расчетные параметры и обновлять при каждом изменении исходных данных. Т.е. вычислительная нагрузка во времени распределяется между вводом данных и запросами.
...
Рейтинг: 0 / 0
Repository & Service
    #39191011
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAСервис - это бизнес-логика .
Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий).
Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :)

Вот тут созрел вопрос. Интересно как бы Вы реализовали.
Есть Stage (один) и Step (ко многим) в базе.
При создании Step на странице сайта нужно выбрать Stage из DropDownList.
Вот модель
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 классов
    }


Вот контроллер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        [HttpGet]
        public ActionResult Create()
        {
            var stages = stageService.GetStages(); 
            var stagesVM = mapper.Map<IEnumerable<StageViewModel>>(stages);
            var model = new StepViewModel()
            {
                StageDropDownListItems = stagesVM
            };
            return View(model);
        }


Видно что какая-то часть логики в контроллере. Вы бы оставили все как есть в контроллере или перенесли бы это в логику?
PS. Сейчас у меня все это в контроллере, есть желание перенести в логику, но тогда придется менять DTO Step в бизнес логике, добавив IEnumerable<Stage>. Напомню что Stage (один) и Step (ко многим) в базе и не логично как-то в DTO Step иметь IEnumerable<Stage>. Заранее спасибо.
...
Рейтинг: 0 / 0
Repository & Service
    #39191047
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAАлексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.
Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода.
...
Рейтинг: 0 / 0
Repository & Service
    #39191048
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то.

А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным.Таки не нужно сравнивать суровую бизнес-аналитику и миллионы запросов со сложностью, сопоставимой с поиском в хэш-таблице - в обоих случаях свои сложности и тонкие места.
skyANAАлексей Кпропущено...
См. "выделение класса" по Фаулеру.
:)

Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.Но какое это имеет отношение к "буттон_клик"? :-)
...
Рейтинг: 0 / 0
Repository & Service
    #39191147
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕвгенийВпропущено...

Не знаю как там проектировали изначально stackoverflow, но при возросших нагрузках выкинули нафик DI контейнеры, как вносящие огромнейшие тормоза.В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода.
Что же ты не приехал на Highload++ 2015 и не поведал им об этом? :)
...
Рейтинг: 0 / 0
Repository & Service
    #39191150
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИМХО многое зависит от бизнеса. В РЖД болото, бизнес дорос до своего потолка и Алексей не видит причин заморачиваться над чем-то.

А у кого-то стартап и цель за 5 лет выйти на аудиторию в несколько миллионов. Ясен пень тут задумаешься над архитектурой и всем выше перечисленным.Таки не нужно сравнивать суровую бизнес-аналитику и миллионы запросов со сложностью, сопоставимой с поиском в хэш-таблице - в обоих случаях свои сложности и тонкие места.
skyANAпропущено...

:)

Алексей, когда предполагается нагрузка в 100 запросов в секунду, а через год в три раза больше, а через 3 года в десять, то надо изначально проектировать, а не потом.Но какое это имеет отношение к "буттон_клик"? :-)
Типа стрелки перевёл на ТСа? :) Кросавчег!
...
Рейтинг: 0 / 0
Repository & Service
    #39191163
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы.
...
Рейтинг: 0 / 0
Repository & Service
    #39191174
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
В каком году это было? Сейчас каждый уважающий себя DI/ORM/и т.п. применяет Emit-кодогенерацию - скорость мало чем отличается от рукописного кода.
Что же ты не приехал на Highload++ 2015 и не поведал им об этом? :)Они и без меня должны это знать. :-)
...
Рейтинг: 0 / 0
Repository & Service
    #39191177
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы.Веб-запросы могут использовать результаты "суровой аналитики", выполняемой "на лету" по оперативным данным.
...
Рейтинг: 0 / 0
Repository & Service
    #39191194
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем 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) нужно использовать.
...
Рейтинг: 0 / 0
Repository & Service
    #39191252
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВАртем 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) нужно использовать.
спасибо. понял. погуглю о причинах.
...
Рейтинг: 0 / 0
Repository & Service
    #39191534
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИ да, я не про "суровую бизнес-аналитику" писал, а про веб-запросы.Веб-запросы могут использовать результаты "суровой аналитики", выполняемой "на лету" по оперативным данным.
К чему это ты?
...
Рейтинг: 0 / 0
Repository & Service
    #39191542
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GskyANAСервис - это бизнес-логика .
Это как если бы Вы что-то делали, делали, проверяли, сверяли, получили результат (вот это сервис)... и на листочек записали (вот это репозиторий).
Просто многие пихают первое в контроллеры, а потом задаются вопросом: а чем у нас сервисы от репозиториев-то отличаются? :)

Вот тут созрел вопрос. Интересно как бы Вы реализовали.
Есть Stage (один) и Step (ко многим) в базе.
При создании Step на странице сайта нужно выбрать Stage из DropDownList.
Вот модель
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 классов
    }


Вот контроллер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        [HttpGet]
        public ActionResult Create()
        {
            var stages = stageService.GetStages(); 
            var stagesVM = mapper.Map<IEnumerable<StageViewModel>>(stages);
            var model = new StepViewModel()
            {
                StageDropDownListItems = stagesVM
            };
            return View(model);
        }


Видно что какая-то часть логики в контроллере. Вы бы оставили все как есть в контроллере или перенесли бы это в логику?
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.
[HttpGet]
public ActionResult Create()
{
    var stages = stageService.GetStages(); 
    var model = mapper.ToViewModel(stages);

    return View(model);
}
...
Рейтинг: 0 / 0
133 сообщений из 133, показаны все 6 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Repository & Service
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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