|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Суть такая. Стараюсь держать логику в отдельных классах-сервисах. Однако пока не знаю как реализовать одну задумку. В этом сервисе есть такой метод: Код: c# 1.
Вариант с Task<MyResult> я отбросил, т.к. такой формат не позволяет сервису возвращать различные статусы, типа NotFound - придется делать какие-то оберточные классы имитирующие данный класс, а в контроллере их разворачивать в настоящий NotFound: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Думаю так слишком неудобно. Поэтому решил, что сервис должен сразу сам возвращать ActionResult<MyResult>. Однако возник следующий вопрос. В контроллере имеются виртуальные методы Код: c# 1. 2.
Вот их мне бы и хотелось задействовать в сервисе. Но как ? Неужели придется в каждом методе предусматривать параметр для передачи ссылки на контроллер ? Код: c# 1. 2. 3. 4. 5. 6. 7.
Не красиво получается. Можно ли в класс-сервис заинжектить контроллер, который обрабатывает текущий запрос, чтобы сделать код сервиса чище ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:21 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Тащить контроллер в сервис - спагетти, забудь. ActionResult возвращать тоже не очень хорошо. Не забывай, контроллер ты можешь унаследовать от своего базового контроллера и делай там какие хочешь универсальные хелперы, которые обрабатывают результат, возвращаемый сервисом ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:36 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCore Код: c# 1.
кроме того, смотри Код: c# 1. 2. 3. 4.
Код: c# 1. 2. 3. 4. 5. 6. 7.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
И вот ради этого ты хочешь нагородить херни с протаскиванием контроллера? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:41 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Так как вы предлагаете решить проблему ? Вы все таки склоняетесь к этой не-менее-спагетти-хрени ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Можно конечно в базовом контроллере сделать методы-хэлперы, куда и перенести код: Код: c# 1. 2. 3. 4.
Но что-то мне так не нравится. Придется создать кучу всех этих прослоечных классов: Код: c# 1. 2.
много тоже левого кода выйдет. Я уж лучше буду передавать в каждый метод сервиса параметр-контроллер. Просто чуть чуть не красиво. Но почище, чем создание десятка прослоечных классов и распарсивание их в контроллере. Я бы вообще может попробовал сам создавать эти NotFoundObjectResult и NotFoundResult. Но, полагаю, это не возможно. Скорее всего контроллер туда подставляет много чего, например заголовки запроса и прочее. Поэтому без контроллера явно не обойтись. Самое лучшее, конечно, тут было бы получить доступ к текущему контроллеру через DI. Или может если бы к ControllerBase был бы статически метод Current... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:48 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Shocker.ProИ вот ради этого ты хочешь нагородить херни с протаскиванием контроллера? Мне думалось, что там все гораздо сложнее. Как минимум должны вставляться какие-то флаги от запроса. Поэтому я хочу обязательно задействовать методы текущего контроллера. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:50 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
ну а чего такого страшного в протаскивании контроллера ? Возьмите вон методы расширения какого нибудь Linq. Там вон протаскивается IEnumerable везде и ничего :) Мне придется протащить контроллер в параметр, но вот думаю, может это меньшее из зол. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:51 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreВариант с Task<MyResult> я отбросил, т.к. такой формат не позволяет сервису возвращать различные статусы, типа NotFound - придется делать какие-то оберточные классы имитирующие данный класс, а в контроллере их разворачивать в настоящий NotFound:На самом деле нормальный вариант - возвращай Task<ServiceResult<MyResult>>. В оболочке ServiceResult можешь себе наделать универсальных полей, типа сообщений об ошибках, статусов всяких и т.п., а на стороне контроллера спокойно анализировать результат каким-то универсальным методом. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:51 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreСкорее всего контроллер туда подставляет много чего, например заголовки запроса и прочее. Поэтому без контроллера явно не обойтись.Я привел тебе код контроллера. Там НИЧЕГО нет, это просто медод-хелпер. Никаких флагов, ничего. WaspNewCoreМожно конечно в базовом контроллере сделать методы-хэлперы, куда и перенести код:Это нормально WaspNewCoreНо что-то мне так не нравится. Придется создать кучу всех этих прослоечных классов:Зачем? Все это NotFound и NoContent - всего лишь статусы. Не нужно создавать никаких классов, или можно использовать готовые. WaspNewCoreну а чего такого страшного в протаскивании контроллера ?Если не понимаешь, что такое спагетти, тогда дерзай. Через годик поймешь на собственных шишках. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:56 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
эм. ну тут явно я не вижу спагетти-кода. Контроллер вызывает сервис и передает ссылку на себя, но не для того, чтобы сервис работал как-то с контроллером. Вот если бы он как-то активно его использовал, может вызывал даже какие-то его методы, и потом возвращал все это назад самому же контрллеру, то да, это был бы спагетти код. Но тут контроллер будет передаваться исключительно для того, чтобы задействовать его хэлпер-методы, для создания различных видов результата. Я думаю это не спагетти :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:00 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreВы все таки склоняетесь к этой не-менее-спагетти-хрени ?тут нет никакого спагетти, контроллер зависит от сервиса, сервис не зависит от контроллера. Спагетти - это когда у тебя всё зависит от всего В идеале слой сервиса не должен зависеть от ASP.NET вообще и находиться в другой сборке ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:00 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreэм. ну тут явно я не вижу спагетти-кода. Контроллер вызывает сервис и передает ссылку на себяВот именно это и есть спагетти. Взаимная ссылка двух классов друг на друга - один из смертных грехов )) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:01 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreВозьмите вон методы расширения какого нибудь Linq. Там вон протаскивается IEnumerable везде и ничего :)Linq-метод зависит от IEnumerable, IEnumerable не зависит от Linq, понимаешь??? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:03 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЯ уж лучше буду передавать в каждый метод сервиса параметр-контроллер ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:03 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Shocker.ProВ идеале слой сервиса не должен зависеть от ASP.NET вообще и находиться в другой сборке+1 ТС, сервис это бизнес логика и чисто шарп код. А контроллер может быть в библиотеках вебСервера Х. Или Y. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:06 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Если подумать, то может даже и нет тут спагетти. Какие тут у нас зависимости по сути ? MyController -> BaseController MyService -> BaseController Обе сущности зависят от BaseController а не друг от друга. Сервис будет использовать не методы MyController, а методы BaseController. Тут нет цикличных ссылок. Я думаю это принципиально. К тому же, этот контроллер будет использоваться совсем немножно. Просто как маленький хэлпер :) А предложенное решение с ServiceResult мне, все же, не нравится. Нужно будет многое учесть и накодить. Боюсь может получится слишком переусложненно. И все это можно решить простой передачей ссылки на базовый контроллер. Я бы, все же, предпочел инжектить контроллер в сервис. Получилось бы аспектное программирование некое. Но раз такого нет, то предпочту передавать ссылку на контроллер. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:19 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreНо раз такого нет, то предпочту передавать ссылку на контроллер.Упорный. Ну ладно, своих шишек набить полезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:24 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Зато ваше решение попахивает огромным дублированием кода :) https://refactoring.guru/ru/smells/duplicate-code ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:35 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Дублирования никакого не вижу. Будут вызываться те же методы контроллера, только не сервисом, а самим контроллером. Я же не предлагаю повторять методы контроллера в сервисе - это как раз вредно, потому что методы работают в контексте запроса/ответа/контроллера и т.п., а сервис, как я сказал выше, в идеале не должен зависеть вообще от ASP.NET. Лень на начальном этапе написать десяток дополнительных строчек впоследствии оборачивается тысячами лишних строк или неделями рефакторинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:43 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЗато ваше решение попахивает огромным дублированием кода :) https://refactoring.guru/ru/smells/duplicate-code показал бы. Или лень? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:54 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Petro123, что показал ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:58 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCorePetro123, что показал ?дублирование на 2 страницы ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 16:59 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
Petro123, ServiceResult, в моей интерпретации приведенной изначально, это некий прослоечный класс. Я думал сделать их кучу, а Shocker.Pro предлагает просто объединить в один класс, но с кучей свойств, как я понимаю, собранных со всех классов типа NotFoundResult, OkResult. Затем возвращать их из сервиса в контроллер, где некий метод будет анализировать этот объект и, в зависимости от заполнения свойств, создавать уже реальные Result'ы. Ну вот все это какое-то завуализованное и усложненное дублирование получается. Т.к. появится логика по парсингу ServiceResult с последующим созданием соответствующих result'ов. Уж лучше тогда как я предлагал, насоздавать MyNotFoundResult, MyOkResult и просто их преобразовывать в классы из Aspnet. Мне не нравится это решение. Я лучше при своем останусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 17:03 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Можно и так: // добавляем контекст MobileContext в качестве сервиса в приложение services.AddDbContext<MobileContext>(options => options.UseSqlServer(connection)); ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 17:11 |
|
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
|
|||
---|---|---|---|
#18+
WaspNewCore, И будет EF контроллере и сервисный слой не нужен)) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 17:12 |
|
|
start [/forum/topic.php?fid=18&msg=39783036&tid=1355022]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
122ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 281ms |
total: | 504ms |
0 / 0 |