.NET Разработчик
6.54K subscribers
442 photos
3 videos
14 files
2.12K links
Дневник сертифицированного .NET разработчика. Заметки, советы, новости из мира .NET и C#.

Для связи: @SBenzenko

Поддержать канал:
- https://boosty.to/netdeveloperdiary
- https://patreon.com/user?u=52551826
- https://pay.cloudtips.ru/p/70df3b3b
Download Telegram
День 1071. #NET6
Не Делайте Этого В .NET 6, Делайте Вот Так. Начало
В C# 10 появилось много хороших вещей: улучшения производительности, горячая перезагрузка, минимальные API и многое другое. Большинство разговоров идёт про важные функции. А что насчёт более мелких улучшений, который всё же помогают сделать ваш ежедневный опыт разработки более продуктивным? Многие из них могут помочь убрать шаблонный код и ускорить достижение цели.

1. Не разбивайте большие коллекции вручную, используйте новый API LINQ
При работе с большими коллекциями иногда нужно разбивать их на более мелкие порции (страницы). Чаще всего это приводит к серии вызовов методов Take и Skip, либо к созданию метода расширения, вроде этого популярного ответа со Stack Overflow:
static class LinqExtensions
{
public static IEnumerable<IEnumerable<T>> Split<T>(
this IEnumerable<T> list, int parts)
{
int i = 0;
var splits =
from item in list
group item by i++ % parts into part
select part.AsEnumerable();
return splits;
}
}

Не делайте так. Вместо этого используйте новый метод Chunk:
int pageSize = 10;
IEnumerable<Employee[]> employeeChunk = employees.Chunk(pageSize);

2. Если вам нужна только дата, не используйте DateTime, используйте DateOnly
Если вам нужно работать с датой и временем в .NET, вы обычно используете DateTime, TimeSpan или DateTimeOffset. Что, если вам нужно работать только с датами и нужен только год, месяц или день? В .NET 6 вы можете использовать новую структуру DateOnly (также можно использовать TimeOnly). Вот стандартный код, который вы могли использовать раньше:
var someDateTime = new DateTime(2021, 11, 09);
// 09.11.2021 12:00:00 AM
var justTheDate = someDateTime.ToShortDateString();
// "09.11.2021"

Не делайте так. Вместо этого используйте структуру DateOnly:
var someDateTime = new DateOnly(2021, 11, 09);
// 09.11.2021

Вы можете делать множество манипуляций с новыми структурами, вроде расчёта дней между датами, и даже комбинировать их с DateTime. Также структура предлагает лучшую безопасность типов для дат и более простую сериализацию.

3. Не пишите кучу кода для логирования HTTP-запросов, используйте новое промежуточное ПО
До .NET 6 регистрировать HTTP-запросы было не сложно, но немного многословно. Один из способов - создать своё промежуточное ПО, где логировать запрос и передавать его дальше по конвейеру.

Не делайте так. Вместо этого используйте новое промежуточное ПО .NET 6 HTTP Logging:
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env)
{
app.UseHttpLogging();
// ...
}
Логирование можно настроить по вашему усмотрению:
public void ConfigureServices(
IServiceCollection services)
{
services.AddHttpLogging(log =>
{
log.LoggingFields = HttpLoggingFields.All;
log.RequestHeaders.Add("X-Request-Header");
log.ResponseHeaders.Add("X-Response-Header");
log.RequestBodyLogLimit = 4096;
log.ResponseBodyLogLimit = 4096;
});
}
Надо следить за тем, что вы пишете в лог, и как часто, но всё же это серьёзное упрощение процедуры.

Окончание следует...

Источник:
https://www.daveabrock.com/2021/12/08/do-this-not-that-the-net-6-edition/
👍29
День 1072. #NET6
Не Делайте Этого В .NET 6, Делайте Вот Так. Окончание
Начало

4. Не используйте костыли для обработки исключений в Blazor Server, используйте компонент ErrorBoundary
Что происходит при возникновении необработанного исключения в Blazor Server? Оно считается фатальным, поскольку «цепь остается в неопределённом состоянии, что может привести к проблемам со стабильностью или безопасностью в Blazor Server». В результате вам может потребоваться разбрасывать повсюду блоки try/catch в качестве превентивной меры или инкапсулировать логику в JavaScript, поскольку код C# после необработанного исключения не будет выполнен.

Не делайте так. Вместо этого используйте новый компонент ErrorBoundary. Это не глобальный обработчик исключений, но он поможет справиться с непредсказуемым поведением, особенно с компонентами, которые вы не контролируете.
<div class="main">
<div class="content px-4">
<ErrorBoundary>
@Body
</ErrorBoundary>
</div>
</div>
Конечно, можно не перехватывать все исключения:
<tbody>
@foreach (var emp in Employees)
{
<ErrorBoundary @key="@emp">
<ChildContent>
<tr>
<td>@emp.Id</td>
<td>@emp.FirstName</td>
<td>@emp.LastName</td>
</tr>
</ChildContent>
<ErrorContent>
Не удалось отобразить #@emp.Id.
</ErrorContent>
</ErrorBoundary>
}
</tbody>

5. Не используйте подробный логгинг в Server.Kestrel, используйте новые подкатегории
Если я хочу включить подробный логгинг для Kestrel, раньше нужно было использовать Microsoft.AspNetCore.Server.Kestrel. Это всё ещё существует, но есть и новые подкатегории, которые упрощают жизнь. В дополнение к Server.Kestrel теперь есть Kestrel.BadRequests, Kestrel.Connections, Kestrel.Http2 и Kestrel.Http3. Допустим, вы хотите регистрировать только неверные запросы:
{
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Server.Kestrel": "Debug"
}
}
}

Не делайте так. Делайте вот так:
{
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Server.Kestrel.BadRequests": "Debug"
}
}
}

6. Не теряйтесь в скобках, используйте пространства имён уровня файлов
В C# 10 представлены пространства имён уровня файлов. Вот обычное объявление класса в C# до версии 10:
namespace SuperheroApp.Models
{
public class Superhero
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
}

Теперь можно убрать скобки в пространстве имён, а также получить все преимущества неизменяемости, использовав записи:
namespace SuperheroApp.Models;

public record Superhero(string? FirstName, string? LastName);

Кстати, о скобках. В C# 10 также введены новые шаблоны свойств. В выражении switch вместо
var tax = sales switch
{
{ Address: { State: "AZ" } } => 1.03M,
{ Address: { State: "FL" } } => 1.07M,
{ Address: { State: "CA" } } => 1.12M
_ => 0
};
можно использовать более ясный формат:
var tax = sales switch
{
{ Address.State: "AZ" } => 1.03M,
{ Address.State: "FL" } => 1.07M,
{ Address.State: "CA" } => 1.12M
_ => 0
};

Источник: https://www.daveabrock.com/2021/12/08/do-this-not-that-the-net-6-edition/
👍10