💡 Используете ли вы чистые SQL-запросы в Entity Framework?
EF Core и SQL
В EF8 чистые SQL-запросы могут возвращать любой тип без необходимости включать его в модель EF.
Можно запрашивать несопоставленные типы с помощью методов S
Метод
, при этом вам не нужно создавать новые сущности в вашей модели данных.
Вот 4-минутное руководство по работе с запросами.
@csharp_1001_notes
  EF Core и SQL
В EF8 чистые SQL-запросы могут возвращать любой тип без необходимости включать его в модель EF.
Можно запрашивать несопоставленные типы с помощью методов S
qlQuery и SqlQueryRaw. 
Метод
SqlQuery использует интерполяцию строк для параметризации запроса, при этом вам не нужно создавать новые сущности в вашей модели данных.
Вот 4-минутное руководство по работе с запросами.
@csharp_1001_notes
⚡️ Дорожная карта разработчиков .NET/C# в 2024 году для начинающих
https://uproger.com/dorozhnaya-karta-razrabotchikov-net-v-2024-godu-dlya-nachinayushhih/
@csharp_1001_notes
  https://uproger.com/dorozhnaya-karta-razrabotchikov-net-v-2024-godu-dlya-nachinayushhih/
@csharp_1001_notes
Не смотря на простоту концепции, детали реализации 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
  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
  https://prom3theu5.github.io/aspirational-manifests/getting-started.html
@csharp_1001_notes
Улучшение производительности JsonSerializer в .NET 8
В .
Посмотрите на цифры на скриншоте 🚀
https://github.com/dotnet/runtime/pull/78646
@csharp_1001_notes
  В .
NET 8 делегаты быстрого пути сериализации используются во многих местах.Посмотрите на цифры на скриншоте 🚀
https://github.com/dotnet/runtime/pull/78646
@csharp_1001_notes
Forwarded from Just Xor
Generic Repository это антипаттерн. Не существует определенных правил каким должен быть интерфейс репозитория - это всецело зависит от предметной области.
Однако есть класс простых приложений, которые работают с данными одинаково. И когда нужно получить простой универсальный способ работы с данными - это единственный случай, когда использование обобщенного репозитория оправдано.
▪Читать подробно
@csharp_1001_notes
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Обработчики исключений с пользовательской фильтрацией в C# ⬇
Они позволяют нам добавлять условия в блоки catch, чтобы исключения не выводились только на основе типа исключения.
Я использую их лишь изредка, но предпочитаю их операторам if/else внутри блока catch.
@csharp_1001_notes
  Они позволяют нам добавлять условия в блоки catch, чтобы исключения не выводились только на основе типа исключения.
Я использую их лишь изредка, но предпочитаю их операторам if/else внутри блока catch.
@csharp_1001_notes
Блог о переходе 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
  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/ Скопируйте содержимое
2/ В Visual Studio нажмите на Edit -> Paste Special -> Paste JSON as classes (или XML).
3/ Вот и все!
@csharp_1001_notes
  В Visual Studio:
1/ Скопируйте содержимое
JSON/XML.2/ В Visual Studio нажмите на Edit -> Paste Special -> Paste JSON as classes (или XML).
3/ Вот и все!
@csharp_1001_notes
.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 является революционным решением.
Он позволяет разработчикам создавать интерактивные веб-приложения на стороне клиента, используя
.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
  CI/CD — это методология, которая позволяет автоматизировать процесс разработки и доставки ПО в продакшн.
Будь вы разработчиком, специалистом по DevOps, тестировщиком или занимаетесь любой современной ролью в ИТ, CI/CD пайплайны стали неотъемлемой частью процесса разработки.
@csharp_1001_notes
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Перехватчики в 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
  Шаблон Хранитель используется, когда:
▪необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления
▪прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта
В C# паттерн Memento может быть реализован с помощью комбинации трех классов:
Originator, Memento и Caretaker.
▪ Подробнее
@csharp_1001_notes
Please open Telegram to view this post
    VIEW IN TELEGRAM
  EF 8 генерирует бодее эффективные запросы, используя 
Разницу в запросах вы можете увидеть в примере на картинке.
@csharp_1001_notes
  IN вместо EXISTS, когда метод Contains используется с подзапросом.Разницу в запросах вы можете увидеть в примере на картинке.
@csharp_1001_notes
▪Часть 1
▪Часть2
@csharp_1001_notes
Please open Telegram to view this post
    VIEW IN TELEGRAM