
Clean Architecture vs Onion Architecture vs Ports и Adapters👉 @KodBlog
@kodblog
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчикаСвязь: @devmangxРКН: https://clck.ru/3FocB6

Clean Architecture vs Onion Architecture vs Ports и Adapters👉 @KodBlog

Вот как можно реализовать фильтр запросов на основе тенанта с использованием EF Core.Вам понадобится сервис, который будет предоставлять TenantId для текущего тенанта. Это значение можно получить из заголовка запроса или клейма Побочный эффект: вы сможете использовать DbContext только в рамках HTTP-запроса.👉 @KodBlog

Встроенный пример IValidatableObject в ASP.NETКто-нибудь использует это?👉 @KodBlog

Большинство разработчиков могут назвать 10 типов тестирования.Но лишь немногие могут объяснить, когда использовать каждый из них.Вот краткий разбор:1. Smoke Testing (смоук-тестирование)Приложение вообще запускается?2. Functional Testing (функциональное тестирование)Каждая функция возвращает корректный результат?3. Integration Testing (интеграционное тестирование)Модули продолжают работать корректно, когда они соединены между собой?4. Regression Testing (регрессионное тестирование)Последний коммит не сломал то, что ещё вчера работало?5. Load Testing (нагрузочное тестирование)Система справляется с реальным трафиком без «захлёбывания»?6. Stress Testing (стресс-тестирование)Что произойдёт, если нагрузку довести до предела?7. Security Testing (тестирование безопасности)Может ли кто-то воспользоваться уязвимостью, о которой вы не знали?8. UI Testing (тестирование пользовательского интерфейса)Интерфейс ведёт себя так, как ожидает пользователь?9. Fuzz Testing (фазз-тестирование)Что сломается, если отправлять приложению случайные или некорректные данные?10. Reliability Testing (тестирование надёжности)Система остаётся стабильной после работы в течение дней, а не минут?👉 @KodBlog

Когда кажется, что в Postgres уже не осталось того, чего он не умеет… 🐘Да, даже полнотекстовый поиск.И его можно подключить через EF Core.С этим вы можете:Настроить индексы для полнотекстового поискаПисать эффективные поисковые запросыРанжировать и сортировать результаты по релевантностиПлавно интегрировать это в ваши .NET-приложенияhttps://www.milanjovanovic.tech/blog/how-i-implemented-full-text-search-on-my-website👉 @KodBlog

SignalR позволяет добавлять real-time функциональность в .NET-приложения.И всё начинается с Hub.Hub — это центральный компонент приложения, который управляет клиентами и отправляет сообщения.Чтобы получать и отправлять сообщения, клиенты должны подключиться к Hub.👉 @KodBlog
Чувак сделал Ctrl+F для всего экрана.Нажимаешь хоткей → экран «замораживается» → вводишь текст для поиска → совпадения подсвечиваются в реальном времени. Работает с любым видимым контентом — невыделяемые PDF, диалоги ошибок, текст на изображениях и т.д.Также можно выделить мышью любую область (drag-select), и приложение автоматически копирует весь текст из этой области — как Snipping Tool, только для текста, с автокопированием.Один .exe, работает локально, используя встроенный в Windows OCR.Вот приложение — github.com/sid1552/ScreenFindTL;DR: Ctrl+F, но для всего экрана.👉 @KodBlog

MapReduce — это популярный фреймворк, изначально разработанный в Google, для эффективной и отказоустойчивой обработки больших распределённых наборов данных. Он был создан, чтобы запускать масштабные вычисления на терабайтах данных, собранных из веба, предоставляя удобный слой абстракции поверх тысяч машин.Фреймворк основан на двух функциях из функциональных языков: Map и Reduce.- Map принимает на вход список элементов и функцию. Она применяет эту функцию к каждому элементу списка и возвращает результат. Например, если список [1,2,3,4], а функция возводит число в квадрат, Map преобразует его в [1,4,9,16].- Reduce принимает список, функцию и начальное значение. Она последовательно комбинирует элементы списка с начальным значением через заданную функцию. Например, если функция суммирует два числа, начальное значение 0, а список [1,2,3,4], Reduce вернёт 10.Внутреннее функционирование MapReduce можно описать следующими шагами:1. Разделение данных: входные файлы делятся на несколько частей.2. Запуск кластерной обработки: запускаются копии программы MapReduce на кластере. Одна копия — мастер, остальные — воркеры. Мастер распределяет Map и Reduce задачи между воркерами. Пользователь может задать количество задач Map и Reduce.3. Map задачи: воркер читает свою часть входных данных, разбивает её на пары ключ/значение и передаёт в пользовательскую функцию Map.4. Промежуточные данные: Map функция возвращает набор промежуточных пар ключ/значение. Эти пары разбиваются на партиции, а информация о расположении каждой партиции отправляется мастеру. Эти партиции становятся входом для Reduce воркеров.5. Reduce задачи: воркер считывает пары, группирует все элементы с одинаковым ключом и передаёт ключ с соответствующим набором значений в пользовательскую функцию Reduce. Результат Reduce добавляется в выходной файл.6. Завершение работы: когда все Map и Reduce задачи выполнены, мастер возвращает контроль пользователю. Выходные данные доступны через файлы, один файл на каждого Reduce воркер
Хватит инжектить IConfiguration. Вот правильный подход в .NET 10Однажды я выкатил систему feature-флагов, которая читала настройки из appsettings.json через IOptions<FeatureFlagOptions>. В деве всё работало нормально. Но в проде, когда команда DevOps переключала флаг, обновляя appsettings.json, ничего не происходило. API продолжал возвращать старые значения. Пользователи застряли. Чтобы подхватить изменения, мне пришлось перезапустить приложение.Исправление? Заменить IOptions<T> на IOptionsMonitor<T>.Изменение в одну строку, которое стоило мне трёх часов дебага и инцидент-репорта. Этот случай показал мне: понимать Options Pattern — не опционально. Это базовая вещь. Разберёмся.Завариваем кофею и читаем статью👉 @KodBlog

Правильно ли вы внедряете зависимости в Controllers?Многие разработчики этого не знают Внедрять зависимости в Controller можно двумя способами:↳ через конструктор↳ через внедрение в методСталкивались с раздутыми контроллерами, у которых в конструкторе слишком много зависимостей?При этом конкретный endpoint использует только часть из них.❌Вы зря расходуете память, потому что все зависимости из конструктора аллоцируются в куче при вызове Controller, независимо от того, будут они использоваться или нет.✅Так почему бы не внедрять нужные объекты прямо в метод endpoint-а?Их можно внедрять без атрибута [FromServices], он больше не нужен. Почти так же, как и в Minimal APIs.Когда вы внедряете зависимости только там, где они реально нужны, это улучшает читаемость, упрощает поддержку и повышает производительность контроллеров.👉 @KodBlog