C# 1001 notes
6.53K subscribers
315 photos
10 videos
2 files
303 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
Download Telegram
🖥 CQRS — это стиль архитектуры, в котором операции чтения отделены от операций записи. Подход сформулировал Грег Янг на основе принципа CQS, предложенного Бертраном Мейером. Чаще всего (но не всегда) CQRS реализуется в ограниченных контекстах (bounded context) приложений, проектируемых на основе DDD. Одна из естественных причин развития CQRS — не симметричное распределение нагрузки и сложности бизнес-логики на read и write — подсистемы Большинство бизнес-правил и сложных проверок находится во write — подсистеме. При этом читают данные зачастую в разы чаще, чем изменяют.

Не смотря на простоту концепции, детали реализации CQRS могут значительно отличаться. И это именно тот случай, когда дьявол кроется в деталях.

Самая большое заблуждение о CQRS:

- Вам нужны отдельные базы данных для чтения и записи .

Правда в том, что вы можете иметь одну базу данных при использовании CQRS.

Вот что на самом деле представляет собой CQRS:

https://www.milanjovanovic.tech/blog/cqrs-pattern-with-mediatr

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Несколько интересных способов создания PDF-файлов в .NET.

https://www.milanjovanovic.tech/blog/how-to-easily-create-pdf-documents-in-aspnetcore

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Вот быстрый и простой способ добавить вход и регистрацию в бэкенд https://ASP.NET Core:

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
Aspir8 (aspire для Kubernetes) поддерживает создание файла docker compose из манифеста aspire!

https://prom3theu5.github.io/aspirational-manifests/getting-started.html

@csharp_1001_notes
Улучшение производительности JsonSerializer в .NET 8

В .NET 8 делегаты быстрого пути сериализации используются во многих местах.

Посмотрите на цифры на скриншоте 🚀

https://github.com/dotnet/runtime/pull/78646

@csharp_1001_notes
Forwarded from Just Xor
🖥 Введение в антипаттерн Generic Repository Pattern на C#

Generic Repository это антипаттерн. Не существует определенных правил каким должен быть интерфейс репозитория - это всецело зависит от предметной области.

Однако есть класс простых приложений, которые работают с данными одинаково. И когда нужно получить простой универсальный способ работы с данными - это единственный случай, когда использование обобщенного репозитория оправдано.

Читать подробно

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
Обработчики исключений с пользовательской фильтрацией в C#

Они позволяют нам добавлять условия в блоки catch, чтобы исключения не выводились только на основе типа исключения.

Я использую их лишь изредка, но предпочитаю их операторам if/else внутри блока catch.

@csharp_1001_notes
🖥 Microsoft Office’s RTC (Real-Time Channel) migration to modern .NET

Блог о переходе Microsoft Office с RTC (Real-Time Channel) на современный .NET!

Это было одно из самых первых применений SignalR в компании!

#dotnet #aspnetcore #signalr

https://devblogs.microsoft.com/dotnet/office-rtc-dotnet-migration/

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥Делегирующие обработчики - это как промежуточное программное обеспечение (middleware) https://ASP.NET Core.

C помощью делегирующих обработчиков можно решить множество проблем:

- Протоколирование
- Трассировка
- Валидация
- Аутентификация
- Авторизация

https://dotnet.microsoft.com/en-us/apps/aspnet

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
Простой способ для генерации классов C# из данных JSON/XML! 🤖🔥

В Visual Studio:
1/ Скопируйте содержимое JSON/XML.
2/ В Visual Studio нажмите на Edit -> Paste Special -> Paste JSON as classes (или XML).
3/ Вот и все!

@csharp_1001_notes
🖥 SOAPHound - это инструмент для сбора данных .NET, который собирает данные Active Directory по протоколу Active Directory Web Services (ADWS).

SOAPHound является альтернативой ряду инструментов безопасности с открытым исходным кодом, которые обычно используются для извлечения данных Active Directory через протокол LDAP.

SOAPHound способен извлекать ту же информацию без прямого взаимодействия с сервером LDAP.

Вместо этого LDAP-запросы оборачиваются в серию SOAP-сообщений, которые отправляются на сервер ADWS с помощью канала связи NET TCP Binding.

Затем сервер ADWS разворачивает LDAP-запросы и направляет их на LDAP-сервер, работающий на том же контроллере домена.

В результате LDAP-трафик не может быть обнаружен обычными средствами мониторинга.

Github

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥Различные методы размещения и развертывания Blazor WebAssembly

В области веб-разработки Blazor WebAssembly является революционным решением.

Он позволяет разработчикам создавать интерактивные веб-приложения на стороне клиента, используя .NET и C#, а не JavaScript.

Это не только открывает новые возможности для веб-разработки, но и приводит к появлению новых методов размещения и развертывания этих приложений.

https://www.thetechplatform.com/post/different-methods-to-host-and-deploy-blazor-webassembly

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ CI/CD Workflow: упрощенный гайд от ByteByteGo

CI/CD — это методология, которая позволяет автоматизировать процесс разработки и доставки ПО в продакшн.

Будь вы разработчиком, специалистом по DevOps, тестировщиком или занимаетесь любой современной ролью в ИТ, CI/CD пайплайны стали неотъемлемой частью процесса разработки.

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

Читать

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Перехватчики в 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Устойчивость приложений и хаос-инженерия

Эта статья знакомит с концепцией отказоустойчивости и хаос-инженерии в приложениях .NET с использованием библиотеки Polly и рассказывает о новых возможностях, позволяющих использовать хаос-инженерию.

В ней приведено практическое руководство по интеграции стратегий хаоса в HTTP-клиенты и показывается, как настраивать конвейеры отказоустойчивости для повышения эффективности работы вашего приложения.

Статья
Polly

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Паттерн Хранитель (Memento) - поведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.

Шаблон Хранитель используется, когда:

необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления
прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта

В C# паттерн Memento может быть реализован с помощью комбинации трех классов: Originator, Memento и Caretaker.

Подробнее

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
EF 8 генерирует бодее эффективные запросы, используя IN вместо EXISTS, когда метод Contains используется с подзапросом.

Разницу в запросах вы можете увидеть в примере на картинке.

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

Часть 1
Часть2

@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
System.IO.Hashing - это действительно полезный пакет NuGet для некриптографического хэширования в .NET.

📌Узнать о нем подробнее

@csharp_1001_notes
⚡️ AspNetCore.ApiGateway

Представляем крутой инструмент: микросервис с конвейером запросов #ASPNETCore.

Без проблем перейдите от веб-интерфейса #ASPNETCore к Veritas API Gateway, в который входят, Swagger, методы авторизации, фильтры, балансировщик нагрузки и многое другое.

Github

@csharp_1001_notes