Category Archives: .NET Core

FluentValidations vs Today [Robert Haken, Vzdělávací okénko, 5.6.2025]

Po půlnoci hlásil validátor: datum vystavení faktury nesmí být v budoucnosti – ale porovnával se včerejším datem. Proč?

  • Záhadný bug v Blazor WebAssembly: fakturační validátor po půlnoci odmítá dnešní datum
  • FluentValidation validátory jsou scoped-service – v Blazor WASM to prakticky znamená singleton
  • Pravidla jako LessThanOrEqualTo(datum) se vyhodnotí jednou v konstruktoru a hodnotu zmrazí
  • Řešení: Must(x => x <= timeProvider.GetLocalNow()) – lambda se vyhodnocuje při každé validaci
  • Přidej custom error message – Must generuje pouze generické hlášení

Vzdělávací okénko prezentoval Robert Haken.

OpenAPI + Scalar UI [Alexandr Hájek, Vzdělávací okénko, 22.5.2025]

Swagger UI v .NET 9 na odchodu? Scalar UI – moderní alternativa s dark mode, vyhledáváním a výměnou za jeden řádek kódu.

  • Proč Microsoft v .NET 9 opouští Swagger generátor a co ho nahrazuje
  • Scalar UI: dark/light mode, integrované vyhledávání a classic layout jako Swagger
  • Jak přidat Scalar UI do projektu – výměna jednoho řádku kódu
  • Konfigurace OIDC autentizace s Microsoft OpenAPI generátorem (access token, scopes)
  • Kompatibilita Scalar UI se staršími verzemi .NET a jinými OpenAPI generátory
  • MIT licence – open source s aktivní komunitou a rychlými opravami

Vzdělávací okénko prezentoval Alexandr Hájek.

Seedy, UoW a Created v HAVIT stacku [Robert Haken, Vzdělávací okénko, 15.5.2025]

Technická změna v seedech, kde se nyní používá Unit of Work. Není potřeba explicitně nastavovat Created atribut, protože se o to postará systém. Taktéž je vhodné použít ExcludeUpdate, aby se Created hodnota nepřepisovala.

Exception types – kdy který použít [Vzdělávací okénko, 10.4.2025]

  • NotImplementedException – výhradně během vývoje jako TODO
  • NullReferenceException – nikdy nevyhrazujeme explicitně, výhradně vyhazováno runtimem
  • NotSupportedException – explicitně indikujeme, že o use-case víme, ale není řešen
  • InvalidOperationException – „nemělo by v produkci nastat“, chyba vývoje (nesprávné volání , switch nad nečekanou hodnotou enum, …)
  • ArgumentNullException, ArgumentOutOfRangeException – výhradně přímé argumenty (ne arg1.Property != null)
  • ArgumentException – obecný problém s argumentem/-y (bližší specifikace v Message)
  • ContractFailedException – default pro Contract.Requires(cond), Contract.Assert(cond), …
  • Exception – nedoporučuje se vyhazovat, mělo být spíše abstract, použijte potomky
  • OperationFailedException – indikace chyby do UI (specficiké pro Havit.Blazor stack)
  • ApplicationException – deprecated

Záznam ze Vzdělávacího okénka HAVIT z 10. dubna 2025.

await foo?.DoAsync() [Vzdělávací okénko, 20.3.2025]

Krátce o pasti zápisu await foo?.DoAsync(), kdy použití null-conditional accessu vede na await null a NullReferenceException.

Novinky v .NET 9 a výhled na .NET 10 – záznam a slides [Robert Haken, WUG Dev Day, 28.2.2025]

Záznam ze Vzdělávacího okénka HAVIT z 28. února 2025, kde jsem telegraficky představoval novinky z „.NET 9 vlny“ a přicházející v „.NET 10 vlně“.

Slides

I[Async]Enumerable [Jiří Kanda, Vzdělávací okénko, 31.10.2024]

Záznam ze Vzdělávacího okénka HAVIT z 31. října 2024, kde Jiří Kanda povídal o IEnumerable interface a jeho asynchronní verzi IAsyncEnumerable.

.NET Memory Internals – záznam a slides [Robert Haken, WUG Days Brno, 6.9.2024]

Záznam z přednášky pro konferenci WUG Days Brno z 6. září 2024, kde jsem ukazoval základy uspořádání paměti v .NET, internals Garbage Collectoru a pokročilý debugging pomocí Windows Debuggeru (WinDbg) a SOS extension.

Téma není zaměřené primárně na novinky, ale jde do hloubky — jak .NET skutečně spravuje paměť, jak to funguje uvnitř a jak se v tom vyznat při pokročilém debuggingu (Memory Dump, WinDbg, SOS).

Zásobník (Stack)

Zásobník je paměť pevné velikosti (defaultně 1 MB na thread), organizovaná pomocí Stack framů. Každé volání metody přidá Stack frame s lokálními proměnnými, parametry a návratovou adresou. Stack je základním mechanismem řízení běhu programu — bez něj by se metody neměly kam vracet. Stack overflow nastává téměř výhradně kvůli nekonečné rekurzi, ne proto, že by aplikace měla příliš hluboký call stack.

Managed Heap a Garbage Collector

.NET runtime si od Windows alokuje nativní paměť a část z ní předá Garbage Collectoru, který ji uspořádá jako managed heap. GC je zodpovědný nejen za uvolňování paměti (jak napovídá název), ale i za samotnou alokaci referenčních typů. Klíčovými koncepty jsou GC Generations (Gen0, Gen1, Gen2) pro generační sběr odpadu a Large Object Heap (LOH) pro velké objekty nad 85 000 bytů.

Windows Debugger (WinDbg) a Memory Dump

WinDbg je mocný, ale uživatelsky nepřívětivý nástroj pro analýzu .NET procesů a Memory Dumpů. Instaluje se přes Microsoft Store. Nejčastější workflow: z Task Manageru vytvoříte Memory Dump (pravé tlačítko → Create memory dump file), soubor načtete do WinDbg a analyzujete. Pro práci s .NET objekty je nezbytná SOS (Son of Strike) extension, která umožňuje zkoumat managed heap, zásobníky threadů a jednotlivé objekty přímo v paměti.

Slides

Novinky v .NET 9 – záznam a slides [Robert Haken, WUG Days Brno, 5.9.2024]

Záznam ze Vzdělávacího okénka HAVIT z 5. září 2024, kde jsem telegraficky představoval novinky přicházející v „.NET 9 vlně“.

Slides

C# & Exceptions – Jak je nepoužívat [Jiří Kanda, HAVIT Vzdělávací okénko, 15.5.2024]

Záznam ze Vzdělávacího okénka HAVIT z 15. května 2024, kde Jiří Kanda povídal o výjimkách v .NET a C#.