Záznam ze Vzdělávacího okénka HAVIT z 5. března 2026. Tomáš Wagner ukazuje, jak krok za krokem postavit AI aplikaci v .NET a C# – od nastavení AI služby přes napojení do aplikace až po pokročilejší funkce jako chat history, tools a strukturovaný výstup.
Nastavení AI služby v .NET – OpenAI, Ollama (OllamaSharp) a Microsoft.Extensions.AI
Jak napojit AI do .NET aplikace a komunikovat s LLM modely
Přepínání mezi AI providery (OpenAI, Anthropic, Google Gemini, Ollama) bez přepisování kódu
Chat history – uchování kontextu konverzace
System prompts, instructions a tools (function calling)
Záznam ze Vzdělávacího okénka HAVIT z 8. ledna 2026.
Vývoj softwaru stojí na knihovnách, nástrojích a frameworcích, jejichž autoři dělali rozhodnutí s těmi nejlepšími úmysly. My je pak jako vývojáři používáme – často přesně tak, jak je doporučeno – a přesto se občas aplikace začne chovat nečekaně, výkon kolísá, build trvá, v produkci aplikace nefunguje. Šlápli jsme na minu. Přednáška ukazuje skutečné miny, na které jsem v posledních měsících a letech narazil. U jednotlivých min si ukážeme, jak je umět najít či jak se jim vyhnout. Pokud máte pocit, že děláte všechno správně a stejně to nefunguje, tahle přednáška je pro vás. 💣
Záznam ze Vzdělávacího okénka HAVIT, kde Lukáš Michl povídal o tom, jak psát signatury metod a DTO tak, aby byl kód srozumitelný bez nutnosti číst implementaci. Přednáška pokrývá antipattern primitive type obsession, strong type values, knihovnu Vogen a best practices pro DTO.
Proč záleží na čitelných signaturách
Dobrá signatura metody prozradí, co metoda dělá, aniž by bylo nutné číst její tělo. To je klíčové pro udržovatelnost – kód se k němu vrací za dny, týdny i roky, a čím méně překvapení signatura skrývá, tím méně chyb při refaktorování vzniká. Lukáš ukazuje sérii příkladů z reálných projektů, kde nejasné signatury vedly k neočekávanému chování.
Primitive type obsession antipattern
Používání primitivních typů (string, int) všude, kde by měl být byznysový typ, vede k nejasnostem: co přesně parametr string name očekává? Je to jméno ve formátu AD, nebo zobrazované jméno? Může být null? Může být prázdný? Tyto otázky se násobí pro každé volání metody. Podobný problém nastává u ID entit – pokud jsou UserID, LoginID i EntityID reprezentovány jako int, záměna při refaktorování neprojde kompilátorem a může tiše způsobit datovou chybu.
Nullable reference types
Zapnutí nullable reference types (#nullable enable) je prvním krokem ke čitelnějším signaturám – kompilátor okamžitě sdělí, zda parametr nebo návratová hodnota může být null. Samo o sobě to ale nestačí, pokud jsou parametry stále primitivní typy bez byznysového kontextu.
Strong type values a value objects
Řešením primitive type obsession jsou strong type values – vlastní typy obalující primitivní hodnotu a nesoucí byznysový kontext i validaci. Implementují se jako C# record struct, čímž se předchází dvojité alokaci na heapu. Validace v konstruktoru zajistí, že nevalidní hodnota vůbec nevznikne – testy kontraktu pak stačí napsat jednou u definice typu, ne u každého volání metody.
Knihovna Vogen
Vogen je source-generátorová knihovna, která automaticky generuje plnohodnotné strong-typed hodnoty – včetně serializace JSON, podpory Entity Framework a možnosti přidávat validace. Bez ní by bylo ruční psaní pro stovky byznysových typů v projektu neúnosné; s Vogen stačí jedna řádka atributu nad definicí.
Strong Typed ID
Specifickým případem jsou ID entit. Knihovna StronglyTypedId řeší záměnu identifikátorů různých entit na úrovni typového systému – kompilátor odmítne předat UserId tam, kde se očekává OrderId.
DTO best practices
Suffix DTO v názvu třídy je kontrakt: objekt by měl být immutable a sloužit výhradně k přenosu dat. Lukáš doporučuje vlastnosti deklarovat s required init – přidání nové vlastnosti pak okamžitě způsobí chybu kompilace u všech míst, kde se DTO inicializuje, a zabrání tiché inicializaci výchozími hodnotami. Kombinace s konstruktorovým zápisem navíc zajistí, že kolega přistupující ke kódu poprvé okamžitě vidí, co všechno DTO nese.