Информация
- В рейтинге
- Не участвует
- Откуда
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Бэкенд разработчик
Старший
C#
PostgreSQL
REST
Redis
RabbitMQ
Docker
Английский язык
Разработка программного обеспечения
Ну, справедливости ради
Обычно зависимости идут не в контроллеры, а хэндлеры/сервисы (впрочем, в случае сервисов, проблема остается но просто в другом слое).
Но, если хочется в контроллер - DI там тоже работает не только в конструкторе контроллера, но и в его методах (эндпоинтах), и можно прокинуть сервис туда.
Я, поэтому, не упомянул в плюсах Minimal API то что мы тащим только нужные для конкретного эндпоинта сервисы: в контроллерах так тоже можно.
Обвязка для регистрации? Ну, это десяток строк кода, плюс по 1 строчке на эндпоинт/группу эндпоинтов.
А если остальное так у нас как были, так и есть много коробочных фильтров/middleware/поддержка OpenAPI от Microsoft. Просто, в большом проекте (а я в статье делаю акцент на такой), всегда появятся свои приколы, и тут уж, не важно какой язык, фреймворк или библиотека - за вас это никто не напишет.
Спасибо, поправил про метадату. Что-то в моей голове заставило меня думать (видимо потому что везде видел MethodInfo), что она появилась только с Minimal API.
Ссылку на цикл статей тоже добавил.
Ну это, как я написал, с примером из моей статьи про VSA. Тут просто для наглядности, каким-нибудь MediatR, валидаторами или репозиториями, как раньше, никто пользоваться не запрещает.
Как можно посмотреть в eShop, похожий подход теперь самими Microsoft одобрен =)
Ну, никто не запрещает так делать (сами Microsoft по сути раньше так и делали), так что вопрос тут скорее о мнениях. (Если, конечно, не нужна гибкость, которую дает ручная регистрация: навешивать метадату на группы эндпоинтов, разбивать эндпоинты по проектам, подключать только часть из них, и т.п. - но это штуки ситуативные и не то чтобы совсем с автоматической регистрацией не совместимы.)
С моей точки зрения, в контроллерах это - задокументированная фича фреймворка, о которой разработчик узнает на этапе "пишем hello world", поэтому там такой подход логичен. В эндпоинтах же - это перемещается на уровень соглашений в проекте.
Уже проблема: к сожалению, нормально задокументированный проект - это скорее редкость, чем норма. И, даже если хорошая документация есть, это дополнительное время на прочтение, усваивание инфы.
И если у нас в проекте одно такое исключение, для эндпоинтов - ничего страшного, правда. Но, идут годы, проект растет, таких исключений уже куча. Вы так не планировали? Ну так другой разработчик подумал, раз есть одно, то почему бы и не два. А вы были в отпуске, или PR прошел мимо вас. А теперь это задача на рефакторинг, на которую менеджер не дает времени, потому что "что нам это даст?", и т.п.
И вот уже незаметненько, новые разработчики сидят и по несколько месяцев онбордятся, пытаясь разобраться что тут происходит. Еще и без возможности пройтись по всей цепочке Usages и отследить, потому что цепочки разорваны рефлексией.
А ведь есть неплохое правило "хороший код должен сам себя документировать". Конечно, его не везде получится соблюсти, но зачем просто так его нарушать.
Избавление от рефлексии целиком и переход на NativeAOT в большом проекте - это тема для отдельной статьи, и переход на Minimal API тут был бы лишь один из шагов. У меня тут меньше опыта, поэтому сразу и то и то я делать не пытался.
Да и, многим сейчас NuGet-зависимости не позволят, которые еще не стать совместимыми.
Но, пара моментов:
Json source generators опционально есть, вот пример для Minimal API. В идеале конечно, да, надо бы их использовать. MethodInfo я там, если посмотрите, парой абзацев ниже как раз показал на что заменить.
EF тоже может работать c Native AOT. Правда, с заметными ограничениями, и в целом, выстрелить себе в колено стало еще проще. Зато с такими ограничениями разница в производительности "в среднем" между EF и raw sql, которая и так стремительно уменьшается последние годы, еще меньше. В общем, вкусовщина
"Поиске" - я имею ввиду как у контроллеров, автоматического. Для регистрации эндпоинтов из моей статьи это выглядело бы приблизительно так:
Заглянул под капот контроллеров, там примерно тот же принцип в чуть более красивой обертке.
И, ничто не мешает так сделать для эндпоинтов. И разные сервисы для DI подхватывать например, или что еще вам нужно. Красиво - просто написал условный Handler для MediatR, а он автоматом уже зарегистрирован, никаких "опять забыл в DI прокинуть".
Вот только, злоупотребление такой черной магией несет за собой негативные последствия: меньшую гибкость, усложнение восприятия для новых разработчиков (в т.ч. разрыв цепочки usage, не проследишь что откуда вызывается). И старых, когда все нюансы работы проекта начнут забываться, и рефлексию, от которой стараемся избавиться
Стоит ли того 1 сэкономленная строчка кода на эндпоинт/сервис? Microsoft вот раньше, с контроллерами, считали, что можно сделать исключение. Сейчас, не безосновательно, они так не делают
По моему опыту - да, лучше, и по пониманию контекста, и по предлагаемым изменениям.
По слою UI на картинке проведен слайс, да. Но это не значит, что за один слайс будет отвечать сверху до низу один человек. Кто-то может писать БД часть, кто-то UI. На практике фронт часто отделен от бэка совсем, и там может быть вообще своя архитектура и бэкендеру об этом думать не нужно - все варьируется от проекта к проекту.
Но на бэке, вряд ли у вас будет что-то типа "я пишу DTO для этого эндпоинта, ты - преобразование моделей БД в DTO, а вот он - валидацию", условно говоря. Этим, как правило занимается один человек, в рамках одной задачи. Отсюда и логика архитектуры.
Но вот в целом, (прошу прощения если ошибаюсь), вы уже пытаетесь рассуждать нетривиальными абстракциями, имея довольно небольшие представления о том, как это все работает на практике. И проблема тут не в вас: я тонкой нитью по статье провожу, что, по моему мнению, мы слишком усложняем проекты и строим лишние абстракции там, где это не нужно. Что приводит к тому, что нам повально нужны сеньоры, которые смогут во всем этом добре разобраться. А VSA - пример того, как упростить это дело.
Я как-то видел проект, где ребята пытались строить CQRS, DDD и чистую архитектуру, пока в самом проекте было полно веселья типа эндпоинтов, возвращающих статус 200 с ошибкой внутри.
Да, VSA в текущем виде - не универсальное решение, хотя у меня есть подозрение что универсального решения и не будет: слишком уж размыты могут быть границы фичи от проекта к проекту. Да и сегодня твой эндпоинт рекомендаций для юзера учитывает только его купленные товары, а завтра пол базы корми нейронке, чтобы угадывать что захочет купить юзер.
В общем, правила может и можно сформулировать, только увы, головой все равно думать придется.
Но с LLM-ками да. По моему опыту, они могут подсказывать куда чаще и качественнее с VSA структурой (да и просто если писать код не забывая о KISS), чем с огородом из слоев и абстракций, даже при одинаковом функционале проекта.
=)
Все мы иногда тупни. Найти себе сплошных senior-ninja-10+yoe-developer в команду, чтобы поддерживать сложную архитектуру, и не испортить все в первый кранч/отпуск тимлида (и это еще если тимлид сам понимает, что делает) - это, конечно, здорово, но сложно и дорого.
Можно найти довольно много книг/статей, и вот прям шаг за шагом построить себе красивую архитектуру следуя всем заветам, и для этого не потребуется быть каким-то одаренным разработчиком. Однако, точно ли оно стоило потраченного времени? Точно ли бизнес выиграет от этого оверхэда? Точно ли коллега прочел ту же книгу и на одной волне с тобой, или просто делает вид?
На разных проектах свои правильные ответы на эти вопросы, но у меня есть ощущение, что к сожалению их обычно не задают себе.
Я там местами описал, в параграфах про DDD и границы подхода: далеко не весь код проекта получится (и стоит) поделить прям по слайсам: горизонтальные слои все равно останутся, и для меня суть VSA скорее в том, чтобы избавиться от горизонтальных слоев (и не размазывать код по всему проекту) там, где это возможно.
Так что, возможно, корректнее это было бы назвать VSA+HSA. Но если ваше понимание этого отличается, то интересно было бы услышать.
Не ну а что, оставят игры мейл ру, и все будут довольны. Кроме пользователей, но кому до них какое дело тут?
Другое дело, правда, что ее предоставление лишь ненадолго отсрочит неизбежное: сегодня информацию о компании, а завтра ключи шифрования.
Жаль, конечно, столь удобный мессенджер для работы терять, думаю возиться с обходом блокировок далеко не все захотят, но лучше уж так чем прогибаться, тут согласен.
Плюс последние годы AMD не могли нормально конкурировать с Intel в средне-высоком ценовом сегменте после того, как у последних получились очень удачные i3/5/7. И в то время как упустил годик на рынке GPU — потерял приличную аудиторию, то на рынке CPU Intel могла себе позволить несколько лет выпускать минорные апдейты: AMD все равно отстает плюс у старых процессоров все хорошо с производительностью.
— Почему он назван новым Gear VR? Это как назвать HTC Vive новой версией Oculus Rift. Этот шлем скорее ответ на Google Daydream.
— Сравнения с другими VR шлемами нет.
— Где нормальный обзор доступных приложений, а не просто ссылка на форум?
— О пульте управления написано одно предложение: он есть.
— О линзах тоже почти ничего. А их качество важно.
Я, конечно, все понимаю реклама товара который у вас есть, но с такими статьями хабр в сполшую рекламу в статьях скатится