Библиотека шарписта | C#, F#, .NET, ASP.NET
22.6K subscribers
2.41K photos
39 videos
85 files
4.6K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
💡 В ASP.NET Core 8 завезли middleware для поддержки тайм-аутов запросов

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

#aspnet #tip by Nabi Karampoor
👍51🔥201
💡 Не храните HttpContext в поле, вместо этого извлекайте его из IHttpContextAccessor всякий раз, когда это необходимо, и используйте его только в области действия метода или блока кода, который его требует.

Таким образом, вы можете гарантировать, что каждый поток получит свой собственный экземпляр объекта HttpContext и что он не будет общим для потоков.

📌 Это считается лучшей практикой по нескольким причинам:

✔️ Безопасность потоков: получение HttpContext из IHttpContextAccessor при необходимости гарантирует, что каждый поток имеет свой собственный экземпляр.

✔️ Управление памятью: HttpContext имеет большое количество связанных с ним объектов и ресурсов, поэтому получение HttpContext только при необходимости позволяет избежать ненужного использования памяти.

✔️ Тестируемость: получение HttpContext с помощью IHttpContextAccessor упрощает написание модульных тестов.

#dotnet #aspnet #tip by Nabi Karampoor
👍56🤔7🥱41
💡 Организуйте ваш файл Program.cs в проектах ASP.NET Core

Вы можете установить пакет ServiceCollectionInstaller, который служит точкой входа для вашего приложения ASP.NET Core. Это альтернатива использованию известных вам Extension Methods👇


$ dotnet add package ServiceCollectionInstaller --version 1.0.2


1️⃣ Реализуйте интерфейс IServiceCollectionInstaller для каждой части конфигураций вашего сервиса, которые вам нужны
2️⃣ Пометьте сборки с помощью интерфейса
3️⃣ Используйте метод расширения BuildIt<T> в WebApplicationBuilder
4️⃣ Запус
тите приложение, установщик автоматически найдет все классы-установщики и настроит ваши сервисы

#dotnet #aspnet #tip by Nabi Karampoor
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔22❤‍🔥6👍5🥱2
💡Как перестать отслеживать ненужные файлы, или Простой способ создания .gitignore в .NET

Во время разработки у вас может накопиться множество файлов, которые не предназначены для включения в систему контроля версий, включая:

🔹Скомпилированные бинарные файлы (*.dll, *.exe)
🔹Промежуточные выходные данные сборки (например, каталоги obj/ и bin/)
🔹Каталоги NuGet-пакетов (например, /packages/)
🔹Файлы проектов Visual Studio (например, *.suo, *.user)

Исправить это можно одной командой:

dotnet new gitignore


#dotnet #aspnet #tip by Nabi Karampoor
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🔥8❤‍🔥1
💡Обработка глобальных ошибок в ASP.NET Core 8: по мотивам статьи Milan Jovanovic

Стандартный способ реализации обработки исключений в ASP.NET Core — использование middleware. Middleware позволяет добавлять логику до или после выполнения HTTP-запросов. Для реализации обработки исключений достаточно добавить оператор try-catch в middleware и возвращать ошибку HTTP-ответа.

ASP.NET Core 8 добавляет новую абстракцию IExceptionHandler для управления исключениями. Этот интерфейс имеет только один метод TryHandleAsync, который пытается обработать указанное исключение в рамках ASP.NET Core pipeline. Если исключение можно обработать, метод должен возвращать true, если нет — false. Это позволяет реализовывать кастомную логику обработки исключений для различных сценариев.

⚙️Для добавления реализации IExceptionHandler в пайплайн запросов ASP.NET Core необходимо сделать две вещи:

1. Зарегистрировать сервис IExceptionHandler с помощью DI.
2. Зарегистрировать ExceptionHandlerMiddleware в пайплайне запросов.

builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
builder.Services.AddProblemDetails();


app.UseExceptionHandler();


Можно добавить несколько реализаций IExceptionHandler, и они будут вызываться в порядке регистрации. Это может быть полезно, например, при использовании исключений для управления потоком.

#dotnet #aspnet #tip by Milan Jovanovic
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🥰3👏2🤔21
💡Как повысить производительность с помощью разделения запросов EF Core: по мотивам статьи Milan Jovanovic

Если у вас есть проблемы с производительностью LINQ-запросов, обратите внимание на новую фичу EF Core 5.0 под названием Query Splitting.

📌 Вызываем метод AsSplitQuery:

dbContext
.Orders
.Include(order => order.LineItems)
.ThenInclude(lineItem => lineItem.Dimensions)
.AsSplitQuery()
.First(order => order.Id == orderId);


В этом случае EF Core сгенерирует следующие SQL-запросы:

SELECT o.*
FROM Orders o
WHERE o.Id = @orderId;

SELECT li.*
FROM LineItems li
JOIN Orders o ON li.OrderId = o.Id
WHERE o.Id = @orderId;

SELECT d.*
FROM LineItemDimensions d
JOIN LineItems li ON d.LineItemId = li.Id
JOIN Orders o ON li.OrderId = o.Id
WHERE o.Id = @orderId;


Для каждого оператора Include у нас есть отдельный SQL-запрос. Преимущество в том, что мы не дублируем данные при извлечении из БД.

📌 Включаем разделение запросов для всех запросов:

services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
"CONNECTION_STRING",
o => o.UseQuerySplittingBehavior(
QuerySplittingBehavior.SplitQuery)));


Все создаваемые EF Core запросы будут разделенными. Чтобы вернуться к одному запросу, нужно вызвать метод AsSingleQuery:

dbContext
.Orders
.Include(o => o.LineItems)
.ThenInclude(li => li.Dimensions)
.AsSingleQuery()
.First(o => o.Id == orderId);


💡Важно знать

🔸Не существует гарантии согласованности для нескольких SQL-запросов. Вы можете столкнуться с проблемой, если одновременно с запросом происходит параллельное обновление.

🔸Чтобы смягчить это, вы можете обернуть запросы внутри транзакции, но это приведет только к проблемам с производительностью в других местах.

🔸Каждый запрос требует сетевого обращения. Если задержки при обращении к БД высоки, это может снизить производительность.

#dotnet #aspnet #tip by Milan Jovanovic
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🤔31
💡 Вы используете Health Checks в ваших веб-приложениях? Если нет, пора воспользоваться этой мощной функцией 💪

🔧 Функциональность:

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

🚀 Преимущества:
1️⃣ Повышение надежности приложения
2️⃣ Быстрое обнаружение и устранение проблем
3️⃣ Лучший пользовательский опыт за счет сокращения времени простоя
4️⃣ Упрощение мониторинга и обслуживания

📚 Лучшие практики:
Реализуйте кастомные проверки работоспособности для удовлетворения специфических потребностей вашего приложения
Используйте теги для категоризации проверок работоспособности и упрощения мониторинга
Установите соответствующие коды ответов и типы содержимого для эндпоинтов проверки работоспособности
Обеспечьте надлежащую аутентификацию и авторизацию для доступа к эндпоинтам проверки работоспособности

#dotnet #csharp #aspnet #tip by Adem Sahin
👍21👏1