Как собрать production-ready CRUD на ASP.NET Core
Telerik разобрала не просто базовый CRUD, а структуру приложения, которую уже можно нормально развивать дальше.
В примере используются:
- ASP.NET Core Web API
- Entity Framework Core
- PostgreSQL
- DTO
- Service layer
- Repository pattern
- AutoMapper
- FluentValidation
- Swagger / OpenAPI
Отдельный акцент сделан на разделении ответственности.
Контроллеры не должны содержать бизнес-логику, работа с БД выносится отдельно, входные данные валидируются до выполнения операций, а DTO не дают напрямую светить наружу модели базы.
Также разбираются:
- создание и настройка проекта
- подключение PostgreSQL
- миграции EF Core
- CRUD endpoints
- обработка ошибок
- валидация
- mapping между entity и DTO
- организация структуры проекта
Хороший материал, если базовый CRUD уже умеешь писать, но хочешь привести проект к более нормальной production-структуре.
https://telerik.com/blogs/creating-production-ready-crud-application-aspnet-core
#aspnetcore #dotnet
Telerik разобрала не просто базовый CRUD, а структуру приложения, которую уже можно нормально развивать дальше.
В примере используются:
- ASP.NET Core Web API
- Entity Framework Core
- PostgreSQL
- DTO
- Service layer
- Repository pattern
- AutoMapper
- FluentValidation
- Swagger / OpenAPI
Отдельный акцент сделан на разделении ответственности.
Контроллеры не должны содержать бизнес-логику, работа с БД выносится отдельно, входные данные валидируются до выполнения операций, а DTO не дают напрямую светить наружу модели базы.
Также разбираются:
- создание и настройка проекта
- подключение PostgreSQL
- миграции EF Core
- CRUD endpoints
- обработка ошибок
- валидация
- mapping между entity и DTO
- организация структуры проекта
Хороший материал, если базовый CRUD уже умеешь писать, но хочешь привести проект к более нормальной production-структуре.
https://telerik.com/blogs/creating-production-ready-crud-application-aspnet-core
#aspnetcore #dotnet
Вышел Aspire 13.5 - обновление с упором на интерфейс и удобство повседневной разработки.
Что добавили:
- обновлённый Dashboard и новый дизайн aspire.dev
- фильтрацию логов и трассировок по тексту, времени и числам
- более понятные ошибки health-check
- загрузку файлов прямо через команды AppHost
- окна прогресса с возможностью отмены
- полноценный терминал прямо внутри Dashboard через WithTerminal()
- поддержку persistent volumes для Kubernetes
- работу с существующими Azure-ресурсами из других resource group, подписок и tenants
- установку Aspire CLI через Homebrew, WinGet, npm, Nix, mise и NuGet
Отдельно удобно, что теперь часть инфраструктурных настроек можно описывать прямо в AppHost на C# или TypeScript, без постоянного ухода в YAML.
https://devblogs.microsoft.com/aspire/whats-new-aspire-13-5/
Что добавили:
- обновлённый Dashboard и новый дизайн aspire.dev
- фильтрацию логов и трассировок по тексту, времени и числам
- более понятные ошибки health-check
- загрузку файлов прямо через команды AppHost
- окна прогресса с возможностью отмены
- полноценный терминал прямо внутри Dashboard через WithTerminal()
- поддержку persistent volumes для Kubernetes
- работу с существующими Azure-ресурсами из других resource group, подписок и tenants
- установку Aspire CLI через Homebrew, WinGet, npm, Nix, mise и NuGet
Отдельно удобно, что теперь часть инфраструктурных настроек можно описывать прямо в AppHost на C# или TypeScript, без постоянного ухода в YAML.
https://devblogs.microsoft.com/aspire/whats-new-aspire-13-5/
Полноценный Lisp можно уместить всего в 99 строк C.
Внутри при этом:
- 21 примитив
- REPL
- сборщик мусора Cheney GC
- числа с плавающей точкой
- указатели
- типы значений
И всё это без `struct`-тегов, без внешних библиотек и без обычных динамических аллокаций для представления объектов.
Главный трюк - NaN boxing.
IEEE 754 оставляет много битов внутри специальных NaN-значений. Их можно использовать как скрытое хранилище:
- часть битов кодирует тип
- до 48 бит можно использовать под указатель
- обычные
В итоге одно 64-битное значение может представлять и число, и указатель, и другие типы данных.
Очень красивый пример того, как устройство IEEE 754 можно использовать для построения компактного рантайма языка.
Внутри при этом:
- 21 примитив
- REPL
- сборщик мусора Cheney GC
- числа с плавающей точкой
- указатели
- типы значений
И всё это без `struct`-тегов, без внешних библиотек и без обычных динамических аллокаций для представления объектов.
Главный трюк - NaN boxing.
IEEE 754 оставляет много битов внутри специальных NaN-значений. Их можно использовать как скрытое хранилище:
- часть битов кодирует тип
- до 48 бит можно использовать под указатель
- обычные
double при этом остаются обычными числамиВ итоге одно 64-битное значение может представлять и число, и указатель, и другие типы данных.
Очень красивый пример того, как устройство IEEE 754 можно использовать для построения компактного рантайма языка.
.NET и Владимир: отличный повод совместить митап и выходные в городе с историей
Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.
В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.
Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.
Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.
Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.
Итоги розыгрыша подведём 14 сентября.
Регистрируйтесь, планируйте поездку и до встречи во Владимире!
Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.
В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.
Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.
Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.
Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.
Итоги розыгрыша подведём 14 сентября.
Регистрируйтесь, планируйте поездку и до встречи во Владимире!
Forwarded from C# (C Sharp) programming
Polly много лет была одной из главных библиотек .NET для устойчивости к временным сбоям: retry, timeout, fallback, rate limiting и circuit breaker.
Теперь Polly движется в сторону платной модели, но
Microsoft.Resilience по-прежнему можно использовать бесплатно.С .NET 8 работа с resilience стала заметно проще: появился новый API Polly и официальные библиотеки Microsoft для построения resilience pipelines.
Что можно настроить:
- Retry
- Fallback
- Timeout
- Rate limiting
- Circuit breaker
Хороший разбор того, как собирать устойчивые cloud-приложения на современном .NET:
https://milanjovanovic.tech/blog/building-resilient-cloud-applications-with-dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Задачи с технических собеседований в одном репозитории
Tech-OA-Interview-Questions - подборка задач из онлайн-тестирований и интервью в технологических компаниях. Пригодится для подготовки к алгоритмическим этапам отбора.
OA, или Online Assessment, - тестирование, которое кандидат обычно проходит перед собеседованиями. В репозитории собраны материалы для подготовки к таким заданиям, в том числе к отбору в Amazon.
Можно использовать как список для практики: решать задачи с таймером, оценивать сложность решения и проверять граничные случаи.
https://github.com/perixtar/Tech-OA-Interview-Questions
Tech-OA-Interview-Questions - подборка задач из онлайн-тестирований и интервью в технологических компаниях. Пригодится для подготовки к алгоритмическим этапам отбора.
OA, или Online Assessment, - тестирование, которое кандидат обычно проходит перед собеседованиями. В репозитории собраны материалы для подготовки к таким заданиям, в том числе к отбору в Amazon.
Можно использовать как список для практики: решать задачи с таймером, оценивать сложность решения и проверять граничные случаи.
https://github.com/perixtar/Tech-OA-Interview-Questions
🔧 Как передать многострочный PEM через Aspire в ASP.NET Core
Сертификаты и ключи в PEM содержат переносы строк, которые могут создавать проблемы при передаче через параметры Aspire. Damien Bod показал обходной вариант для локальной разработки с User Secrets и развёртывания в Azure.
Схема простая:
* закодировать PEM в однострочный Base64
* сохранить значение в конфигурации AppHost под ключом
* объявить приватный ключ через
* передать параметр приложению через
* в ASP.NET Core декодировать Base64 обратно в исходный PEM
В статье есть helper-класс для преобразования, настройка AppHost и пример создания сертификата через
Base64 сохраняет переносы строк при передаче. Приватный ключ после кодирования остаётся секретом: Base64 не обеспечивает шифрование.
https://damienbod.com/2026/09/01/using-multiline-parameters-for-aspire-and-asp-net-core-with-user-secrets-and-azure-default-deployments/
Сертификаты и ключи в PEM содержат переносы строк, которые могут создавать проблемы при передаче через параметры Aspire. Damien Bod показал обходной вариант для локальной разработки с User Secrets и развёртывания в Azure.
Схема простая:
* закодировать PEM в однострочный Base64
* сохранить значение в конфигурации AppHost под ключом
Parameters:ИмяПараметра* объявить приватный ключ через
AddParameter(..., secret: true)* передать параметр приложению через
WithEnvironment* в ASP.NET Core декодировать Base64 обратно в исходный PEM
В статье есть helper-класс для преобразования, настройка AppHost и пример создания сертификата через
X509Certificate2.CreateFromPem.Base64 сохраняет переносы строк при передаче. Приватный ключ после кодирования остаётся секретом: Base64 не обеспечивает шифрование.
https://damienbod.com/2026/09/01/using-multiline-parameters-for-aspire-and-asp-net-core-with-user-secrets-and-azure-default-deployments/
Software Engineering
Using multiline Parameters for Aspire and ASP.NET Core with user secrets and Azure default deployments
Multiple line secrets or configuration do not work in Aspire per default. An example of this is using a PEM file for certificates. This posts shows how the multiple line configuration parameters ca…
15 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle C# разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_csharp_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
# C# 14: конкурентный кеш без race condition
Реализуйте потокобезопасный кеш:
Условия: если 100 потоков одновременно запросят один key, factory должна выполниться только один раз. Остальные ждут тот же Task. Если вычисление завершилось ошибкой - запись удаляется из кеша. Отмена одного клиента не должна отменять работу для остальных. Глобальный lock использовать нельзя.
Вопрос: как избежать race condition между созданием общего Task и удалением упавшего значения из кеша?
Реализуйте потокобезопасный кеш:
public sealed class AsyncCache<TKey, TValue>
where TKey : notnull
{
public Task<TValue> GetOrCreateAsync(
TKey key,
Func<CancellationToken, Task<TValue>> factory,
CancellationToken cancellationToken = default)
{
// TODO
}
}
Условия: если 100 потоков одновременно запросят один key, factory должна выполниться только один раз. Остальные ждут тот же Task. Если вычисление завершилось ошибкой - запись удаляется из кеша. Отмена одного клиента не должна отменять работу для остальных. Глобальный lock использовать нельзя.
Вопрос: как избежать race condition между созданием общего Task и удалением упавшего значения из кеша?