en
Feedback
C# 1001 notes

C# 1001 notes

Open in Telegram

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp

Show more
6 612
Subscribers
+924 hours
+667 days
+5630 days
Posts Archive
🖥 Обработка ошибок с помощью IExceptionHandler в ASP.NET Core 8.0 Относительно недавно на свет появился ASP.NET Core 8.0, и
🖥 Обработка ошибок с помощью IExceptionHandler в ASP.NET Core 8.0 Относительно недавно на свет появился ASP.NET Core 8.0, и теперь можно обрабатывать ошибки с помощью IExceptionHandler. А вот и полезная статья о том, как это делать. ⏩Вкратце о IExceptionHandler IExceptionHandler — это интерфейс, который предоставляет разработчику обратный вызов для обработки известных исключений в центральном расположении. IExceptionHandler реализации регистрируются путем вызова IServiceCollection.AddExceptionHandler. Время существования экземпляра IExceptionHandler — одноэлементное. Можно добавить несколько реализаций, и они вызываются в порядке регистрации. Если обработчик исключений обрабатывает запрос, он может вернуться true к остановке обработки. Если исключение не обрабатывается обработчиком исключений, то элемент управления возвращается к поведению по умолчанию и параметрам из по промежуточного слоя. Для обработки и необработанных исключений создаются различные метрики и журналы. 📎 Статья 📎 Доки от Windows, как обрабатывать ошибки @csharp_ci

🖥 Задание C# Задача: реализуй на C# метод расширения для строки, который будет проверять, является ли данная строка палиндро
🖥 Задание C# Задача: реализуй на C# метод расширения для строки, который будет проверять, является ли данная строка палиндромом. Палиндром — это слово/фраза/последовательность символов, которая читается одинаково в обе стороны ("шалаш", "ротор", "12321") Получилось? Можешь смотреть код возможного решения @csharp_ci

🖥 Новый пример, показывающий, как использовать открытые API-интерфейсы телеметрии с aspire dashboard, работающим как автоном
🖥 Новый пример, показывающий, как использовать открытые API-интерфейсы телеметрии с aspire dashboard, работающим как автономный контейнер. https://learn.microsoft.com/en-us/samples/dotnet/aspire-samples/aspire-standalone-dashboard/ @csharp_ci

🚀 Text2sql Нейросеть, специализирующаяся на написании SQL-запросов (и не только) по текстовому описанию Описание: A Regex ex
🚀 Text2sql Нейросеть, специализирующаяся на написании SQL-запросов (и не только) по текстовому описанию Описание:
A Regex expression to match a password that contains at least one lowercase letter, one uppercase letter, one digit, one special character, and is at least 8 characters long
Ответ нейросети:
^(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;'/?.><,])(?=.*[^s]).{8,}$
🔗 text2sql.ai @sqlhub

⚡Онлайн-Хакатон "Городские Легенды" от Группы компаний Росохрана и ООО «Эпсилон»! 💡Кейсы хакатона: 1. Разработка интерактивн
⚡Онлайн-Хакатон "Городские Легенды" от Группы компаний Росохрана и ООО «Эпсилон»! 💡Кейсы хакатона: 1. Разработка интерактивного голосового помощника с использованием анимированного аватара. 2. Интеграция интерактивного аватара в городскую экосистему цифровых сервисов. 👨‍💻Для кого хакатон? - C++/C#-разработчиков; - Unity-разработчиков; - 3D-Моделлеров; - UX/UI-дизайнеров; - AI-Специалистов; - Команды из 5 человек; - Готовых внедрить любимых персонажей в городскую среду и побороться за главный приз! 🏆Общий призовой фонд - 700 000 рублей! 📅Дата проведения: 11-18 Марта 📍Формат: Онлайн Подробная информация и регистрация: https://tglink.io/05539cf28394?erid=LjN8KWcqb

⚡️ Каждый разработчик должен знать о тестовых контейнерах. Это отличный инструмент, который нужно знать и применять, когда он
⚡️ Каждый разработчик должен знать о тестовых контейнерах. Это отличный инструмент, который нужно знать и применять, когда он вам понадобится. Вот пример работы с Testcontainersна .NET: https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/ #dotnet #csharp #fsharp @csharp_1001_notes

🖥 Параллельная Публикация Уведомлений в MediatR MediatR — это популярная библиотека с простой реализацией паттерна посредник в .NET. Посредник — паттерн шаблон проектирования, обеспечивающий взаимодействие множества объектов, формируя при этом слабое зацепление и избавляя объекты от необходимости явно ссылаться друг на друга. С ростом популярности паттерна CQRS MediatR стала популярной библиотекой для реализации команд и запросов. Издатель — подписчик — поведенческий шаблон проектирования передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Но она также поддерживает паттерн издатель-подписчик с использованием уведомлений. Можно опубликовать экземпляр INotification, и несколько подписчиков обработают опубликованное сообщение. Разберемся как это можно делать параллельно. Нам нужен класс, реализующий INotification:
public record OrderCreated(Guid OrderId) : INotification; А также реализация соответствующего INotificationHandler:
public class OrderCreatedHandler : INotificationHandler<OrderCreated> { private readonly INotificationService svc; public OrderCreatedHandler( INotificationService service) { svc = service; } public async Task Handle( OrderCreated notification, CancellationToken ct) { await svc.SendOrderCreatedEmail( notification.OrderId, ct); } }
Теперь можно публиковать сообщение с помощью IMediator или IPublisher:
await publisher.Publish( new OrderCreated(order.Id), cancellationToken);
MediatR вызовет все соответствующие обработчики. До 12й версии MediatR стратегия публикации вызывала каждый обработчик по отдельности. Однако появился новый интерфейс INotificationPublisher, управляющий тем, как вызываются обработчики.
Реализация по умолчанию - ForeachAwaitPublisher:
public class ForeachAwaitPublisher : INotificationPublisher { public async Task Publish( IEnumerable<NotificationHandlerExecutor> executors, INotification notification, CancellationToken ct) { foreach (var e in executors) { await e .HandlerCallback(notification, ct) .ConfigureAwait(false); } } }
Она вызывает обработчики по одному и завершается неудачей при ошибке в одном из обработчиков.
Но вы также можете использовать TaskWhenAllPublisher (показаны только отличия в реализации метода Publish:
var tasks = executors .Select(e => e.HandlerCallback(notification, ct)) .ToArray(); return Task.WhenAll(tasks);
TaskWhenAllPublisher вызывает все обработчики одновременно и выполняет их все независимо от того, возникали ли в них ошибки. Если вы сохраните задачу, возвращенную TaskWhenAllPublisher, вы можете получить доступ к свойству Task.Exception, содержащему экземпляр AggregateException, и реализовать обработку исключений.
Настройка стратегии публикации происходит в методе AddMediatR. Если вы хотите использовать стратегию TaskWhenAllPublisher, вы можете: - указать значение для свойства NotificationPublisher (тогда издатель будет синглтоном), - указать тип стратегии в свойстве NotificationPublisherType и использовать свойство ServiceLifetime для задания времени жизни:
services.AddMediatR(cfg => { … cfg.NotificationPublisher = new TaskWhenAllPublisher(); // или cfg.NotificationPublisherType = typeof(TaskWhenAllPublisher); cfg.ServiceLifetime = ServiceLifetime.Transient; });
Вы также можете реализовать пользовательский экземпляр INotificationPublisher и вместо этого использовать собственную реализацию.
Плюсы Параллельного запуска обработчиков уведомлений обеспечивает значительное повышение производительности по сравнению с поведением по умолчанию. Однако обратите внимание, что все обработчики будут использовать одну и ту же область видимости. Если у вас есть экземпляры сервисов, которые не поддерживают конкурентный доступ, вы можете столкнуться с проблемами. К сожалению, одним из таких является EF Core DbContext. 📌 Подробнее @csharp_1001_notes

⚡️ AspNetCore.ApiGateway Представляем крутой инструмент: микросервис с конвейером запросов #ASPNETCore. Без проблем перейдите
⚡️ AspNetCore.ApiGateway Представляем крутой инструмент: микросервис с конвейером запросов #ASPNETCore. Без проблем перейдите от веб-интерфейса #ASPNETCore к Veritas API Gateway, в который входят, Swagger, методы авторизации, фильтры, балансировщик нагрузки и многое другое. ▪ Github @csharp_1001_notes

System.IO.Hashing - это действительно полезный пакет NuGet для некриптографического хэширования в .NET. 📌Узнать о нем подроб
System.IO.Hashing - это действительно полезный пакет NuGet для некриптографического хэширования в .NET. 📌Узнать о нем подробнее

🖥 SQL в Фокусе: Полное Руководство. 100 ключевых Вопросов с собеседований ▪Часть 1 ▪Часть2 @sqlhub
🖥 SQL в Фокусе: Полное Руководство. 100 ключевых Вопросов с собеседований Часть 1 Часть2 @sqlhub

Стоит ли становиться Rust-разработчиком в 2024 и как это сделать? 💻Узнайте на бесплатном практическом уроке от OTUS, где вы
Стоит ли становиться Rust-разработчиком в 2024 и как это сделать? 💻Узнайте на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом: - обсудите основные направления развития языка и его инфраструктуры; - рассмотрите наиболее востребованные навыки по этим направлениям; - разберёте типичное собеседование на должность Rust-разработчика в различных областях. Встречаемся 26 февраля в 20:00 мск в рамках курса «Rust Developer. Professional». Доступна рассрочка на обучение! 👉Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://tglink.io/4c0293ce6c0c?erid=LjN8KWx1q Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

EF 8 генерирует бодее эффективные запросы, используя IN вместо EXISTS, когда метод Contains используется с подзапросом. Разни
EF 8 генерирует бодее эффективные запросы, используя IN вместо EXISTS, когда метод Contains используется с подзапросом. Разницу в запросах вы можете увидеть в примере на картинке. @csharp_1001_notes

🖥 Паттерн Хранитель (Memento) - поведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать и с
🖥 Паттерн Хранитель (Memento) - поведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние. Шаблон Хранитель используется, когда: ▪необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления ▪прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта В C# паттерн Memento может быть реализован с помощью комбинации трех классов: Originator, Memento и Caretaker. Подробнее @csharp_1001_notes

Учитесь тому, что пригодится в работе и в жизни — бесплатно, с Яндекс Практикумом. Тут на одной странице собраны курсы, котор
Учитесь тому, что пригодится в работе и в жизни — бесплатно, с Яндекс Практикумом. Тут на одной странице собраны курсы, которые помогут попробовать себя в разных IT-профессиях и получить практический навык. 17 разных курсов по программированию, аналитике данных, маркетингу, менеджменту и дизайну. Прохождение занимает от 2 до 20 часов. Например, можно разобраться в основах Java, научиться искать и нанимать тестировщиков, задизайнить плакат для фестиваля еды и ещё много чего. Выбирайте курс по душе и пробуйте себя в разных профессиях!

🖥 Устойчивость приложений и хаос-инженерия Эта статья знакомит с концепцией отказоустойчивости и хаос-инженерии в приложения
🖥 Устойчивость приложений и хаос-инженерия Эта статья знакомит с концепцией отказоустойчивости и хаос-инженерии в приложениях .NET с использованием библиотеки Polly и рассказывает о новых возможностях, позволяющих использовать хаос-инженерию. В ней приведено практическое руководство по интеграции стратегий хаоса в HTTP-клиенты и показывается, как настраивать конвейеры отказоустойчивости для повышения эффективности работы вашего приложения. ▪СтатьяPolly @csharp_1001_notes

Учитесь тому, что пригодится в работе и в жизни — бесплатно, с Яндекс Практикумом. Тут на одной странице собраны курсы, котор
Учитесь тому, что пригодится в работе и в жизни — бесплатно, с Яндекс Практикумом. Тут на одной странице собраны курсы, которые помогут попробовать себя в разных IT-профессиях и получить практический навык. 17 разных курсов по программированию, аналитике данных, маркетингу, менеджменту и дизайну. Прохождение занимает от 2 до 20 часов. Например, можно разобраться в основах Java, научиться искать и нанимать тестировщиков, задизайнить плакат для фестиваля еды и ещё много чего. Выбирайте курс по душе и пробуйте себя в разных профессиях!

🔥 Как написать свой API: OData на С# за пару часов? Покажет Эдгар Пилипсон – ведущий инженер в Nexign. Приходите на бесплатн
🔥  Как написать свой API: OData на С# за пару часов?  Покажет Эдгар Пилипсон – ведущий инженер в Nexign.  Приходите на бесплатный практический урок от OTUS! Вебинар будет особенно полезен разработчикам, которые хотят использовать гибкий API для работы с данными. Встречаемся 13 февраля в 20:00 мск в рамках курса «C# ASP. NET Core разработчик».  Доступна рассрочка на обучение! ➡️   Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок и получить запись. Пройти тест.

🖥 Перехватчики в EF Core Перехватчики в EF Core помогают перехватывать, изменять или подавлять операции EF Core. Перехватчики регистрируются для каждого экземпляра DbContext при настройке контекста. Каждый перехватчик реализует интерфейс IInterceptor. Несколько распространённых производных интерфейсов включают - IDbCommandInterceptor, - IDbConnectionInterceptor, - IDbTransactionInterceptor, - ISaveChangesInterceptor. Вам не нкжно реализовывать эти интерфейсы напрямую. Лучше использовать конкретные реализации и переопределить необходимые методы. Вот вариант использования перехватчиков с помощью самого распространённого перехватчика SaveChangesInterceptor, который добавляет поведение при сохранении изменений в базе данных. Добавление записей аудита Записи аудита изменений сущностей - ценная функция в некоторых приложениях. Вы записываете дополнительную информацию аудита каждый раз, когда объект создаётся или изменяется. Также это могут быть значения «до» и «после», в зависимости от ваших требований. Например, создадим интерфейс IAuditable с датами создания и изменения объекта:
public interface IAuditable { DateTime Created { get; } DateTime? Modified { get; } }
Добавим UpdateInterceptor для записи значений аудита. Он использует ChangeTracker для поиска всех экземпляров IAuditable и устанавливает соответствующее значение свойства. Здесь мы используем метод SavingChangesAsync, который запускается до того, как изменения будут сохранены в БД.
internal sealed class UpdateInterceptor : SaveChangesInterceptor { public override ValueTask<InterceptionResult<int>> SavingChangesAsync( DbContextEventData e, InterceptionResult<int> result, CancellationToken ct = default) { if (e.Context is not null) UpdateEntities(e.Context); return base .SavingChangesAsync(e, result, ct); } private static void UpdateEntities(DbContext ctx) { var now = DateTime.UtcNow; var entities = ctx .ChangeTracker .Entries<IAuditable>() .ToList(); foreach (var e in entities) { if (e.State == EntityState.Added) e.Property( nameof(IAuditable.Created)) = now; if (e.State == EntityState.Modified) e.Property( nameof(IAuditable.Modified)) = now; } } }
Эту реализацию можно легко расширить, включив в неё, например, информацию о текущем пользователе.
Зарегистрировать перехватчик можно следующим образом:
services.AddSingleton<UpdateInterceptor>(); services.AddDbContext< IApplicationDbContext, AppDbContext>( (sp, opts) => opts .UseSqlServer(connString) .AddInterceptors( sp.GetRequiredService<UpdateInterceptor>());
👉 Подробнее @csharp_1001_notes

Это приглашение на One Day Offer для C#-разработчиков от Ozon Tech. Ребята расширяют направление Логистики и готовы сделать о
Это приглашение на One Day Offer для C#-разработчиков от Ozon Tech. Ребята расширяют направление Логистики и готовы сделать оффер в два шага. Хочешь писать высоконагрузочный код и реализовывать сценарии бизнес-логики лидирующего e-com в России? Оставляй заявку: https://s.ozon.ru/o38dQ26 Будет короткий технический скрининг и финальное собеседование 17 февраля. Бонус для кандидатов: встреча-знакомство с тимлидами — можно увидеть все команды и выбрать свою! Всё это онлайн. А ещё ждёт мерч. Подробности тут

🖥 Где изучать C# в 2024. Бесплатные курсы и полезные ресурсы ▪Читать @csharp_1001_notes
🖥 Где изучать C# в 2024. Бесплатные курсы и полезные ресурсы Читать @csharp_1001_notes