SignalR je populární knihovna pro .NET, která umožňuje obousměrnou komunikaci mezi klientem a serverem v reálném čase. Tento nástroj je zvláště užitečný pro aplikace, které vyžadují okamžité přenosy dat, jako jsou chatové aplikace, live notifikace nebo zobrazení změn na webových stránkách v reálném čase. V této kapitole se podíváme na konkrétní příklad implementace SignalR pro chatovou aplikaci, kterou lze spustit pomocí .NET konzolové aplikace a MVC webové aplikace.
Nejprve je třeba spustit projekt webové aplikace. Pokud používáte Visual Studio 2022, vyberte profil https v nástrojové liště a spusťte projekt Northwind.SignalR.Service.Client.Mvc bez ladění. Pokud pracujete ve Visual Studio Code, stačí v terminálu spustit příkaz dotnet run --launch-profile https, čímž se aplikace spustí v režimu https. Poté přejděte do prohlížeče Chrome a zadejte adresu https://localhost:5131. Na této stránce by měla být již předvyplněna jména (např. Alice) a skupiny (Sales, IT). Po kliknutí na tlačítko "Register User" server prostřednictvím SignalR hubu vrátí odpověď, která potvrdí registraci.
Dalším krokem je otevření nového okna prohlížeče nebo spuštění jiného prohlížeče, například Firefoxu či Edge, a opětovné načtení stránky https://localhost:5131/. Tentokrát zadejte jméno Bob a přidejte skupinu Sales. Po kliknutí na "Register User" se Bob zaregistruje do chatu a stane se součástí skupiny Sales. Podobně postupujte pro třetího uživatele Charlieho, který se připojí k IT skupině.
Když máte všechny tři prohlížeče otevřené, můžete začít testovat funkčnost chatu. Alice například pošle zprávu do skupiny Sales. Bob a Alice tuto zprávu obdrží, což potvrdí správnou funkčnost broadcastové komunikace pro skupiny. Pokud Bob následně pošle zprávu do skupiny IT, obdrží ji Alice a Charlie, ale ne Bob, což potvrzuje správnost směrování zpráv do specifických skupin. Pokud Bob pošle zprávu pouze Alice, obdrží ji pouze Alice. Když Charlie pošle zprávu pro všechny uživatele (leave To prázdné), všichni účastníci obdrží zprávu.
Další důležitou funkcionalitou SignalR je podpora pro streamování dat, což je užitečné pro scénáře, kde data přicházejí po částech v průběhu času. Místo odesílání strukturovaných zpráv může server i klient využívat streamy pro efektivní přenos dat, jako je například aktuální cena akcií. SignalR podporuje jak streamování dat od serveru k klientovi (například odesílání dat o cenách akcií v reálném čase), tak i streamování od klienta k serveru.
Pro streamování dat vytvořte novou třídu, která definuje data, která budou streamována. Například pro cenu akcií můžeme vytvořit třídu StockPrice, která bude obsahovat název akcie a její aktuální cenu. Poté ve třídě StockPriceHub implementujeme metody pro streamování dat, kde metoda GetStockPriceUpdates bude periodicky posílat aktualizace o cenách akcií. Tato metoda vrací objekt typu IAsyncEnumerable, což je způsob, jakým lze v .NET 8 a novějších verzích implementovat asynchronní streamování.
Příklad implementace streamování pro akcie může vypadat takto:
Tento přístup umožňuje efektivní přenos dat, která se průběžně mění, aniž by se musel server nebo klient blokovat na jednu konkrétní odpověď.
Pokud jde o samotného klienta, ten může být realizován jako .NET konzolová aplikace, která se připojuje k SignalR hubu, poslouchá zprávy a umožňuje uživatelům komunikovat. V konzolové aplikaci musí být implementována registrace uživatele a přijímání zpráv, jak je ukázáno ve výše uvedeném příkladu kódu. Po připojení k hubu aplikace vyčká na zprávy a ty zobrazuje na obrazovce.
Důležitým aspektem při práci se SignalR je správné zacházení s více klienty, ať už jde o zasílání zpráv do specifických skupin, odesílání zpráv pouze konkrétním uživatelům, nebo streamování dat. SignalR poskytuje širokou škálu funkcionalit, které je možné využít k vytvoření bohatých interaktivních aplikací, kde je kladen důraz na real-time komunikaci.
Aby byla komunikace opravdu efektivní, doporučuje se také věnovat pozornost optimalizaci výkonu aplikace. Při práci s velkými objemy dat nebo s aplikacemi, které vyžadují vysokou dostupnost, je nutné implementovat metody pro správu připojení, kontrolu latence a minimalizaci počtu potřebných požadavků. Pro tento účel je dobré se seznámit s nástroji, jako je PowerToys a jeho funkcí FancyZones, která pomůže uspořádat okna pro efektivní práci s více prohlížeči nebo aplikacemi.
Jak správně implementovat MVVM v .NET MAUI a podpořit obousměrné datové vazby
MVVM (Model-View-ViewModel) je designový vzor, který je velmi podobný vzoru MVC (Model-View-Controller), ale s několika zásadními rozdíly, které umožňují lepší práci s datovými vazbami v aplikacích, zejména v těch, které běží na více platformách. Tento vzor zahrnuje tři hlavní složky: Model, View a ViewModel, a jejich vzájemné propojení se používá k oddělení logiky aplikace a uživatelského rozhraní.
Model představuje třídu, která reprezentuje data, často v podobě objektu, který je spojený s databází, např. relační databází. View je grafické rozhraní, které zobrazuje data uživateli a umožňuje mu s nimi interagovat. ViewModel pak slouží jako prostředník mezi Modelem a View. Obsahuje logiku pro práci s daty a pro zajištění, že jakékoliv změny v datech budou okamžitě reflektovány ve View. Významným prvkem je podpora obousměrné vazby, která umožňuje synchronizaci změn mezi View a ViewModel.
Pro implementaci obousměrné datové vazby v .NET MAUI je nezbytné použít rozhraní INotifyPropertyChanged, které umožňuje, aby se při změně hodnoty v modelu automaticky aktualizovalo i uživatelské rozhraní. Tento proces spočívá v tom, že každá vlastnost třídy, která se má používat v datové vazbě, musí mít implementovanou událost PropertyChanged, která je vyvolána při změně hodnoty této vlastnosti. Při každé změně je odesláno oznámení, že daná vlastnost byla změněna, což způsobí, že všechny komponenty uživatelského rozhraní, které jsou na tuto vlastnost napojené, se automaticky aktualizují.
Příklad implementace pro model, který podporuje dvousměrné vazby, je následující. Pokud máte třídu, která má vlastnost pro uložení názvu firmy, bude její kód vypadat takto:
Tato metoda zajistí, že jakmile se hodnota vlastnosti změní, zavolá se událost PropertyChanged, která následně způsobí, že uživatelské rozhraní bude tuto změnu reflektovat. Tento proces se děje bez potřeby jakéhokoliv manuálního zásahu, což výrazně zjednodušuje správu datových vazeb v aplikacích s dynamickým obsahem.
Pro zjednodušení implementace je možné použít atribut CallerMemberName, který umožňuje automaticky získat název vlastnosti, která byla změněna, bez nutnosti ji explicitně uvádět v kódu. To je užitečné zejména při práci s velkým množstvím vlastností, kde je potřeba minimalizovat riziko chyb při zadávání názvů.
Pokud třída implementuje INotifyPropertyChanged, je možné na ní vytvářet obousměrné vazby, což znamená, že změny provedené v uživatelském rozhraní (např. textový vstup) se automaticky promítnou do dat modelu a naopak.
Dalším užitečným prvkem, který úzce souvisí s INotifyPropertyChanged, je třída ObservableCollection. Ta implementuje rozhraní INotifyCollectionChanged, což znamená, že poskytuje notifikace, když jsou položky přidány, odstraněny nebo změněny. Tato kolekce je velmi užitečná při práci s ovládacími prvky jako jsou ListView nebo TreeView, kde chceme, aby se uživatelské rozhraní dynamicky aktualizovalo v případě změn v kolekci.
Pro tvorbu ViewModelu s obousměrnými datovými vazbami je potřeba, aby třída implementovala INotifyPropertyChanged a měla metody pro aktualizaci vlastností, které se mohou měnit. Zde je ukázka implementace ViewModelu pro zobrazení detailu zákazníka:
Tento třída implementuje obousměrné datové vazby, což znamená, že změny provedené v uživatelském rozhraní budou automaticky reflektovány v datovém modelu a naopak.
Důležité je si uvědomit, že obousměrné datové vazby jsou velmi silný nástroj pro práci s dynamickými uživatelskými rozhraními. Umožňují efektivně synchronizovat stav aplikace s uživatelským rozhraním, ale je nutné pečlivě spravovat události a změny, aby nedocházelo k nežádoucímu chování, jako je například nekonečné zavolání události při každé změně. Také je důležité mít na paměti výkon aplikace, zejména při práci s velkými kolekcemi dat, které se mohou často měnit.
Jak efektivně spravovat vlákna, výkonnost a prostředky v operačních systémech
Vlákna představují základní stavební prvek současného multitaskingového modelu, který umožňuje moderním operačním systémům efektivně vykonávat více úkolů současně. Vlákno vykonává kód, řádek po řádku, a každému procesu je obvykle přiřazeno jedno vlákno. Tento model může narazit na problémy, když je potřeba zpracovávat více úkolů najednou. Vlákna jsou také zodpovědná za sledování věcí, jako je aktuálně ověřený uživatel a pravidla pro lokalizaci, která by měla být použita podle aktuálního jazyka a regionu.
Většina moderních operačních systémů, včetně Windows, využívá preemptivní multitasking, což simuluje paralelní vykonávání úkolů. Tento model rozdělí čas procesoru mezi vlákna, přičemž každému vláknu je přidělen časový úsek, který se střídá mezi jednotlivými vlákny. Když vlákno dokončí svůj časový úsek, je pozastaveno a procesor umožní běh dalšímu vláknu. Tento přechod mezi vlákny není bez nákladů – procesor musí uložit kontext aktuálního vlákna a znovu načíst kontext následujícího vlákna. Tento proces vyžaduje jak čas, tak i prostředky.
Pokud vývojář potřebuje kompletní kontrolu nad několika složitými úkoly, může se rozhodnout pro vytváření a správu jednotlivých instancí vláken. Pokud však existuje hlavní vlákno, které vykonává více menších úkolů, je efektivní využít třídu ThreadPool. Ta umožňuje přidání delegátů, které ukazují na konkrétní úkoly, do fronty, kde jsou automaticky přiděleny vláknům v poolu. Pro správu vláken na vyšší úrovni abstrakce je však výhodnější použít typ Task, který se v tomto článku podrobněji prozkoumá.
Vlákna mohou mít tendenci soutěžit o sdílené prostředky, jako jsou proměnné, soubory nebo objekty databáze. Pro tento účel existují různé typy, které je možné použít a které se podrobně prozkoumají v následujících kapitolách. Pokud jde o rozdělení úkolů mezi vlákna, je důležité si uvědomit, že zdvojnásobení počtu vláken neznamená automatické zkrácení času potřebného pro dokončení úkolu. Ve skutečnosti to může vést k prodloužení doby provádění úkolu, jak ukazuje praktická ukázka na obrázku 4.1.
Důležitým pravidlem je nikdy předpokládat, že více vláken vždy znamená lepší výkon. Doporučuje se provádět testy výkonu na základní implementaci kódu bez použití více vláken a následně je porovnat s verzí, která využívá více vláken. Výsledky testování by měly být prováděny v prostředí co nejvíce podobném produkčnímu, aby byly výsledky co nejpřesnější.
K monitorování výkonu a využívání prostředků je nezbytné mít nástroje, které umožní sledovat rychlost a efektivitu kódu. Bez schopnosti monitorovat výkon nemůžeme efektivně hodnotit vylepšení. Pro tento účel existují různé nástroje a třídy v rámci systému .NET, které usnadňují monitorování doby běhu a využívání paměti. Prvním užitečným nástrojem je třída Stopwatch, která nám umožňuje měřit čas provádění operací. Tato třída nabízí metody jako Restart, které obnoví časovač a začnou měřit čas od nuly, a Stop, která zastaví měření.
Kromě sledování času je také důležité sledovat využívání paměti. Třída Process nabízí informace o alokované virtuální paměti a fyzické paměti pro konkrétní proces. Při monitorování výkonu je nutné věnovat pozornost nejen funkčnosti kódu, ale i velikosti paměti a výkonnosti jednotlivých datových typů. Výběr správného datového typu je klíčový – pro uložení velkého množství čísel může být lepší použít typ s nižšími nároky na paměť, ale pro výpočty s menším počtem čísel bude efektivnější typ, který nabízí vyšší rychlost zpracování na specifickém procesoru.
V průběhu vývoje se často může stát, že i při použití typů s menšími nároky na paměť se jejich výkon může lišit v závislosti na konkrétním procesoru. To znamená, že je vhodné provádět testování výkonu nejen v rámci vývoje, ale také ve fázi testování, abychom zjistili, jaký typ je pro konkrétní úkol nejefektivnější.
Výběr datového typu by měl být nejen otázkou aktuálních potřeb, ale i budoucí údržby kódu. Nezbytným aspektem, který je často přehlížen, je udržovatelnost – jak snadné bude pro jiného vývojáře upravit nebo rozšířit váš kód. Volba typu, která není dostatečně zdokumentována, může později vést k problémům při úpravách nebo opravách chyb.
Pro efektivní sledování a analýzu výkonu a paměti může být užitečné vytvořit speciální třídu pro monitorování, například třídu Recorder, která využívá Stopwatch a Process třídy pro sledování času a alokace paměti. Díky této třídě lze získat přehled o časech a paměťových nárocích přímo v průběhu vykonávání kódu.
Jak rychle začít s implementací technologií a architektonických rozhodnutí ve vývoji aplikací
Výběr správných technologií a architektonických rozhodnutí je klíčovým faktorem pro úspěšný vývoj aplikací. Tento proces je nevyhnutelný pro každého vývojáře, který chce rychle a efektivně začít pracovat na aplikacích a službách. Jak ale najít vhodná řešení a implementace pro konkrétní úkoly a cvičení? Odpovědí je GitHub repository, kde jsou k dispozici podrobné ukázky kódu. Tyto ukázky lze stáhnout nebo klonovat přímo z repozitáře na odkazu: https://github.com/markjprice/apps-services-net7. Pokud s tímto procesem nejste obeznámeni, na konci první kapitoly knihy naleznete podrobné instrukce, jak postupovat.
Kniha, kterou držíte v rukou, se zaměřuje na různé aspekty vývoje aplikací a služeb v rámci ekosystému .NET a C#. V první kapitole, nazvané "Představení aplikací a služeb s .NET", se dozvíte, jak správně nastavit své vývojové prostředí pomocí Visual Studio 2022 nebo Visual Studio Code. V této části knihy jsou také podrobně probrány nové vlastnosti jazyka C# a knihoven v moderním .NET, což vám pomůže pochopit, jak efektivně využít moderní technologie a nástroje.
Další kapitoly se zaměřují na různé aspekty práce s daty. Kapitola 2, "Správa relačních dat pomocí SQL Serveru", vás provede nastavením SQL Serveru na různých platformách – ať už na Windows, v Docker kontejnerech na macOS nebo Linuxu, či v cloudu Azure. Kromě toho se seznámíte s knihovnami ADO.NET (Microsoft.Data.SqlClient) pro práci s nízkoúrovňovými operacemi a s objektově-relationalním mapováním (ORM) pomocí Entity Framework Core (EF Core).
V kapitole 3, "Správa NoSQL dat pomocí Azure Cosmos DB", se zaměříte na cloud-native NoSQL úložiště a naučíte se využívat nativní API a pokročilý grafový API Gremlin. Tento typ úložiště je vhodný pro aplikace, které vyžadují vysokou dostupnost a globální škálovatelnost, což je často případ moderních webových a mobilních aplikací.
Dále, kapitola 4 se zaměřuje na "Benchmarking výkonu, multitasking a konkurenci", kde se naučíte optimalizovat výkon aplikace prostřednictvím souběžného vykonávání úloh pomocí vláken a úkolů. Tato témata jsou nezbytná pro aplikace, které potřebují zpracovávat velké množství dat nebo reagovat na události v reálném čase.
Ve kapitole 5 se budete zabývat "Implementací populárních knihoven třetích stran", které usnadňují vývoj aplikací, ať už jde o manipulaci s obrázky (ImageSharp), logging (Serilog), mapování objektů (AutoMapper) nebo validaci dat (FluentValidation). Tyto nástroje vám pomohou zjednodušit běžné úkoly při vývoji a soustředit se na klíčovou logiku vaší aplikace.
V kapitole 6, "Pozorování a modifikace vykonávání kódu dynamicky", se seznámíte s technikami jako reflexe, atributy a generování kódu během kompilace. Tyto techniky jsou nezbytné pro pokročilé scénáře, jako je například tvorba dynamických knihoven nebo vývoj aplikací, které se adaptují na různé situace a prostředí.
Další kapitola, 7, "Práce s daty a časem, mezinárodní podpora", se zaměřuje na to, jak správně pracovat s časovými pásmy, formáty datumu a mezinárodními lokalizacemi. Správná implementace těchto funkcí je základním kamenem pro tvorbu aplikací, které mají globální uživatelskou základnu.
Bezpečnost dat a aplikací je samozřejmě nezbytnou součástí vývoje jakékoliv aplikace. V kapitole 8, "Ochrana vašich dat a aplikací", se naučíte používat šifrování, hashing a podepisování pro ochranu dat a ověřování uživatelů. Zabezpečení je v dnešní době klíčovým faktorem, protože stále více aplikací je cílem kybernetických útoků.
Ve 13. kapitole, "Broadcasting real-time komunikace s použitím SignalR", se zaměříte na real-time aplikace, jako jsou notifikační systémy nebo online dashboardy. Technologie SignalR vám umožní snadno implementovat aplikace, které potřebují okamžitou aktualizaci informací u všech klientů v reálném čase.
Kapitola 14, "Vývoj serverless nanoslužeb s Azure Functions", vám ukáže, jak využít serverless architekturu pro aplikace, které nevyžadují trvalý běh serverů. Tento přístup je ideální pro vývoj aplikací, které reagují na určité události, například odeslání zprávy nebo nahrání souboru.
V průběhu knihy budete postupně odhalovat různé způsoby, jak efektivně implementovat webové rozhraní uživatele pomocí ASP.NET Core, Blazor, nebo mobilních a desktop aplikací pomocí .NET MAUI. Každá z těchto kapitol je zaměřena na konkrétní technologii nebo platformu, která vám umožní dosáhnout maximální produktivity při vývoji aplikací pro různá zařízení.
Kromě samotného kódu, je důležité, aby čtenář pochopil i širší kontext každé technologie. Důraz na správnou architekturu a návrh aplikací je klíčový pro úspěch jakéhokoliv projektu. Je nezbytné nejen znát jednotlivé nástroje, ale i umět je kombinovat a přizpůsobovat specifickým potřebám projektu. Technologické volby by měly být vždy informované, promyšlené a reflektující konkrétní požadavky a cíle aplikace.
Jak vznikají periodické řešení při Hopfově bifurkačním bodu: analytické přístupy a normalizované formy
Jak umění a řemesla zformovaly kulturní dědictví islámského světa?
Jak efektivně sledovat veřejná jednání a jak zajistit přístup k rozhodovacím procesům?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский