Как стать автором
Обновить

Комментарии 34

НЛО прилетело и опубликовало эту надпись здесь

Есть отличие: хендлер с двумя дженериками, поэтому можно все обвесить одним набором декораторов. С методами репозиториев и сервисов этот номер не пройдёт, потому что будут другие интерфейсы с другим набором параметров и методов. А то что у всех есть эта своя уютная инфраструктура, это да, есть. Если вам достался код ситхов, проще перейти на темную сторону, не находите?:)

Но и тут же не без проблем. Сейчас ведь как работает


in A -> in B -> /* some logic /* -> out B -> out A.


То есть луковая архитектура. Если вдруг понадобится сделать


in A -> in B -> /* some logic /* -> out A -> out B.


То все станет намного печальнее

Вначале был код понятный любому имбецилу без пояснений, а потом 100500 букв, чтоб объяснить, как работает Ваш более простой и понятный способ, да и то ничерта непонятно в итоге?
  • 2 года опыта (junior) — фигачим код в контроллер
  • 3-5 лет опыта работы (middle) — используем чужой фреймворк
  • 6-8 лет опыта работы (senior) — строим фреймворки типа описанного в статье
  • >8 лет опыта работы (dzen) — фигачим код в контроллер
??? лет опыта (нирвана) — покупаешь домик в горах / на берегу океана, наслаждаешься видом, не пишешь код
Ах если бы…
Джуна мидл сразу заставит юзать чужой фреймворк, который сам не до конца понимает как он работает.

Я много пользовался фреймворком MediatR (после просмотра видео Clean Architecture with ASP.NET Core 2.1) и в статье вижу очень многие вещи, которые всплывали у меня при изучении. Тут даже главное не то, что я много примеров приложений испробовал (а их много было), а то, что я пытался повторить отдельные части фреймворка в своих приложениях и пробовал сделать шаг в сторону и посмотреть, что получится. В статье примерно такой же опыт, очень хорошо вербализованный. Хорошая статья, мне нравится. Надо будет перечитать ещё раз, более вдумчиво.

Не понятно для чего это все нужно в ASP.NET, как минимум мне не понятно для чего вы вынесли логику аутентификации/авторизации в контроллер, для этого существует слой Middlware. Контроллер же предназначен именно для бизнес-логики, все сервисные вещи и в том числе валидации можно вынести именно в этот слой, а контроллере только использовать атрибуты для доконфигурирования под обработку конкретного запроса.

Ага, можно. Либо в middleware, либо в action filter. На Кодфесте я даже добавил несколько слайдов об этой альтернативе. В этом случае middleware / action filter будет выполнять функцию соответствующего декоратора, а тип результата выполнения pipeline будет всегда IActionResult. Основная идея остаётся прежней, но меняются детали реализации. Плюс — работает из коробки. Минус — жестко привязано к MVC. Спасибо, что упомянули. Попозже расширю пост контентом с Кодфеста.

Было бы любопытно посмотреть пример с кодфёста. Вообще, может быть можно уже выложить презентацию куда-нибудь?
Ну жестко привязано будет не к MVC, а к ASP.NET все таки MVC точно так же работает как часть конвейера наравне с остальными модулями.
Будет ссылка на проект?

В ближайшее время не будет.

А вот и ссылка. Обещанного, как говорится, три года ждут.

Довольно эклектичная смесь получилась в результате. И как всегда, напрашивается курьёзный вывод: C# не очень-то пригоден для создания корпоративных приложений. Там, где в других языках всё встроено ( F#) и имеются необходимые абстракции — в C# мы велосипедим фабрики декораторов с автофаком и автомаппером, самодельными примитив тайпами и проверками на нулл.
И ждём тепрь уже C# 8. Ну да, до этого ждали 7. Но и в восьмом всё равно не появилось долгожданных иммутабл рекордов. Measure типов с размерностью, как и алгебраических, мы не дождёмся уже никогда, а проблема с нуллами решена костыльно и некомпозабельно.
Так что же заставляет нас раз за разом выбирать для создания энтерпрайз системы такой неподходящий инструмент?
Я всерьёз призываю автора попробовать взять нормальный фреймворк и нормальный язык (да вот хотя бы giraffe и F#) и наваять то же самое на нём. Читабельность кода увеличится в разы, а объём бойлерплейта сократится просто на порядок.
Причина довольно проста, для того чтобы писать что-то на F# нужно сначала сломать себе мозг, функциональное программирование — это другая парадигма, которую воспринимать могут далеко не все. Не думаю есть ли смысл уменьшать аудиторию доклада в 20-30 раз. К тому же на F# есть свои доклады.
Можно писать что-то низкоуровневое императивное на C#, он прекрасно для этого подходит, не потребуется ломать мозг без нужды. Но ведь предпринимаются попытки именно энтерпрайз на нем делать, да такой чтоб подлерживаемый-расширяемый.
это другая парадигма, которую воспринимать могут далеко не все.

Кого годами учили ООП как серебряной пуле и больше ничему другому.
Для людей кому в универе давали ФП все эти декораторы фасадов фабрик тоже будут казаться сломом мозга.


Истина как всегда посередине, но у шарпа перекос в сторону ООП слишком сильный. F#/Scala в этом плане посерединке.


Ну а вообще классическое ООП имхо устарело. Те же тайпклассы просто на порядок лучше всего, что предлагается в ООП в виде интерфейсов/классов/...

Вот когда энтерпрайз будет активно разворачиваться в сторону F# — тогда можно будет говорить об устаревании ООП. А пока по F# одна активная вакансия на весь город — так зачем тогда вообще его учить и ломать мозг, если потом эти знания не получится никуда применить?
Почему не получится? Я вот прихожу на проект и говорю «делаем на F#. Людей обучим. Профит будет такой-то». Люди вон хачкель как-то затаскивают и отлично с ним живут.

Портировать существующие проекты конечно не стоит, а вот начинать новые почему бы и нет. где-то пятая часть докладов на дотнексте на F#, к примеру, включая akka.net.

Что касается вакансий, то их чуть больше, и найти себе по вкусу среди них наверняка можно. Да и ЗП там вкусные

image
Ну если у проекта бесконечное финансирование и бесконечное время продакшена — можно и переучить C#-программистов на F#. В остальных случаях это выглядит как минимум странно, а как максимум даже некомпетентно со стороны предложившего.
А при чем тут бесконечное время? C# -> F# перейти можно за месяц, чтобы выдавать адекватный код. Если у вас люди на месяц нанимаются то мб и не подойдет.

В остальных случаях это выглядит как минимум странно, а как максимум даже некомпетентно со стороны предложившего.

Некомпетентно одновременно повысить качество продукта и мотивацию за счет разового обучения? Ну да, так ведь никто никогда не делает.
Ну вообще да, не делают. Компания нанимает c# программистов чтобы писать код на c#, а потом кто-то вдруг решает всех их переучить на другой язык и вообще на другую парадигму за счет работодателся, просто потому что ему вдруг показалось, что так будет лучше. Ну серьезно?
Серьезно.

Я например пришел на C# вакансию, год писал C#/Solitiy. Щас проект завершен, следующий планируем на Rust. Полет отличный.
Сам факт, что за это в комментариях топите вы одни уже наводит на какое-какие мысли. Ну и «планируем» и «полет отличный» как-то странно вместе вяжутся. Стоит наверно обсудить эту тему когда вы уже что-то на Rust напишете по проекту.
Ну я уже писал, когда планировали альтернативный wasm-движок для выполнения EVM байткода (вместо солидити), просто этот подход себя не оправдал.

Вместе вяжется то, что язык дело десяток. Программист одного языка/стека довольно несчастный человек. Особенно если он верит, что ничего лучше придумать нельзя, и все новые языки маргиналы без будущего.

В этом году в Питере будет сразу два доклада в поддержку вашей точки зрения: https://dotnext-piter.ru/2019/spb/talks/4vehcump1bwnqlqrewsilq/, https://dotnext-piter.ru/2019/spb/talks/2nvbecxhuasmfgnmxmnczt/. Приходите с VanKrock, будет что обсудить.

Насчет декораторов, которые похожи на chain of responsibility, если их через di внедрять и каждый класс лежит в своем файле то чтоб понять цепочку вызовов придется прыгать по файлам и тот страшный вложенный вызов кажется не таким уж и страшным…
Может удобнее обернуть запрос через расширение, например, request.UseHandle<А>().UseHandle<В>()?

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

В моем случае тоже di используется глобально, я накидал проект. Там я обернул упрощенные асинхронные хендлеры в pipeline, а сам вызов цепочки убрал в билдер. Но хендлеры отделены от хендлеров команд и запросов, они не вписались в конвеер.
У меня вызывают улыбку люди вроде вас. Нет чтобы отрефакторить код, вы вместо этого свой Фреймворк пишите. Так для правки — можно было и для вашего UserService сделать декораторы так-то на Логирование и на профилирование и на все остальное.

Вдохновлён этой статьей и докладом. Помимо того, что декораторы позволяют добавить функционал к уже готовой бизнес логике, они еще и переиспользуемые. Фантастика.
Но в голове не укладывается как это применить на своих проектах. Декоратор валидации хорошо смотрится если он один, а если нужна армия валидаторов для разных сущностей и их полей? Как нужно мыслить при написании клиентского кода?
P. S. Многие согласятся что в статье про архитектуру ПО слишком много деталей о C#, это мешает пониманию. Псевдокод был бы уместнее. А вообще, прекрасный материал.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий