Využití technologie .NET MAUI v kombinaci s Blazorem a nativními platformami umožňuje vývojářům vytvářet aplikace, které jsou schopné běžet napříč různými zařízeními a operačními systémy, čímž poskytují uživatelům plynulý a konzistentní zážitek. .NET MAUI přináší robustní nástroje pro práci s nativními funkcemi zařízení, což umožňuje vývojářům snadno integrovat a pracovat s různými zařízeními a systémy.

Jedním z klíčových aspektů práce s .NET MAUI je jeho schopnost komunikovat s nativními platformami. To zahrnuje přístup k systémovým clipboardům, práci s místními soubory, uchovávání dat v bezpečných úložištích, detekci senzoru, monitorování připojení k síti a využívání nativních uživatelských rozhraní. Příkladem může být integrace s clipboardem, což umožňuje uživatelům kopírovat a vkládat text mezi různými aplikacemi.

Při práci s clipboardem je důležité si uvědomit, že tato funkcionalita se týká pouze textového obsahu. V aplikaci může například uživatel napsat popis kategorie v textovém editoru a následně tento text zkopírovat a vložit zpět do aplikace. Představme si následující postup:

  1. V souboru EmployeesPage.xaml změníme titul, nastavíme vertikální vzdálenost v rámci zásobníku na hodnotu 10 a nahradíme existující prvek label rámcem, textovým polem a dvěma tlačítky pro kopírování a vkládání textu z clipboardu. Kód vypadá takto:

xml
<StackLayout Spacing="10"> <Frame> <Entry x:Name="NotesTextBox"/> </Frame>
<Button Text="Copy to Clipboard" Clicked="CopyToClipboardButton_Clicked"/>
<Button Text="Paste from Clipboard" Clicked="PasteFromClipboardButton_Clicked"/> </StackLayout>
  1. V souboru EmployeesPage.xaml.cs přidáme metody pro obsluhu kliknutí na tlačítka, které volají výchozí metody pro kopírování a vkládání textu do clipboardu:

csharp
namespace Northwind.Maui.Blazor.Client.Views
{ public partial class EmployeesPage : ContentPage { public EmployeesPage() { InitializeComponent(); } private async void CopyToClipboardButton_Clicked(object sender, EventArgs e) { await Clipboard.Default.SetTextAsync(NotesTextBox.Text); } private async void PasteFromClipboardButton_Clicked(object sender, EventArgs e) { if (Clipboard.HasText) { NotesTextBox.Text = await Clipboard.Default.GetTextAsync(); } } } }
  1. Po spuštění projektu na emulátoru Androidu se uživatel dostane na stránku „Employees“ a může zadat text do textového pole. Po kliknutí na tlačítko „Copy to Clipboard“ se text zkopíruje do clipboardu, který je automaticky synchronizován mezi Android emulátorem a Windows systémem. Takto můžeme na Windows použít standardní aplikaci, jako je Poznámkový blok, k vkládání zkopírovaného textu.

Pro plné využití nativních funkcí .NET MAUI je důležité správně pochopit, jak integrovat různé platformy do vaší aplikace. To zahrnuje i použití dalších nativních funkcí jako je detekce připojení k síti, interakce s GPS nebo senzory, což zlepšuje interakci s aplikací a její přizpůsobení specifickým podmínkám každé platformy. Tyto integrace jsou často klíčové pro vytvoření uživatelského zážitku, který není pouze funkční, ale také intuitivní a příjemný pro uživatele.

Uživatelé by měli mít na paměti, že i když .NET MAUI poskytuje silné nástroje pro integraci s nativními funkcemi, je nutné pečlivě plánovat, jak tyto funkce využít v různých prostředích. Například správné ošetření rozdílů v ovládání mezi mobilními zařízeními a desktopovými aplikacemi může zásadně ovlivnit použitelnost aplikace. Kromě toho je důležité správně implementovat asynchronní operace pro minimalizaci zpoždění při práci s clipboardem, soubory nebo jinými nativními funkcemi. Když vývojář zajistí hladkou interakci mezi aplikací a systémem, uživatelský zážitek bude mnohem bohatší.

Jak efektivně spravovat NoSQL data pomocí Azure Cosmos DB

Azure Cosmos DB je globálně distribuovaná NoSQL databáze, která poskytuje širokou škálu možností pro správu a analýzu dat. Díky své flexibilitě umožňuje pracovat s různými typy dat a optimalizovat operace pro různé scénáře. Základními prvky správy dat v Azure Cosmos DB jsou SQL dotazy, uživatelsky definované funkce (UDF), uložené procedury a grafová API, což umožňuje nejen rychlé vyhledávání dat, ale i jejich komplexní manipulaci.

Při práci s Cosmos DB je kladeno důraz na správu a optimalizaci dotazů, které jsou prováděny na serveru. Použití uložených procedur a UDF přináší výrazné zlepšení výkonu, protože kód běží přímo tam, kde jsou uložena data. Například v případě komplexních výpočtů nebo transformací dat může být potřeba vytvořit vlastní funkce, které provedou výpočet přímo na serveru bez nutnosti přenášet velké objemy dat mezi serverem a klientem. To nejenže zrychluje operace, ale také zjednodušuje architekturu aplikace.

Příklad použití uživatelsky definované funkce (UDF) pro výpočet daně z produktů vypadá následovně: funkce salesTax může vzít cenu produktu a spočítat příslušnou daň podle předem stanovené sazby. Takový přístup umožňuje snadnou aplikaci složitého byznysového pravidla přímo na serveru, čímž se eliminuje potřeba provádět tento výpočet na úrovni aplikace.

Použití SQL dotazů v Azure Cosmos DB je také nezbytnou dovedností. V praxi se často používají dotazy pro filtrovaní a agregaci dat, což umožňuje rychlé získání potřebných informací. Například dotaz na všechny produkty, které mají cenu vyšší než 100, a následné vypočítání daně z jejich ceny, může být efektivně zpracováno přímo na serveru. Tento přístup výrazně šetří šířku pásma a výpočetní výkon na straně klienta.

Další významnou funkcí Azure Cosmos DB je její schopnost zvládat transakce na serverové straně, které zajišťují ACID vlastnosti (atomicita, konzistence, izolace a trvalost) bez potřeby používat klientský kód. To znamená, že více operací může být spojeno do jedné transakce, která může být buď potvrzena, nebo vrácena zpět v případě chyby. Tento mechanismus je klíčový pro aplikace, kde je potřeba zajistit integritu a správnost dat při vykonávání složitých operací.

Azure Cosmos DB podporuje také práci s grafovými daty pomocí Gremlin API. Gremlin API poskytuje možnosti pro manipulaci s grafovými databázemi, což je užitečné v případě aplikací, které pracují s propojenými daty, jako jsou sociální sítě, doporučovací systémy nebo systémy pro analýzu vztahů. Pomocí Gremlinu lze efektivně vyhledávat a analyzovat vztahy mezi entitami, což je klíčové pro výkonné grafové analýzy.

Pro správu nákladů a optimalizaci využívání prostředků je důležité pravidelně čistit nevyužívané Azure Cosmos DB účty a jejich zdroje. Pokud se rozhodnete ukončit účet, všechny databáze a kontejnery v rámci účtu budou smazány, což pomáhá minimalizovat náklady spojené s nevyužívanými službami.

Aby bylo možné efektivně pracovat s NoSQL databázemi jako Azure Cosmos DB, je třeba se nejen seznámit se základy SQL dotazů a serverového programování, ale i s pokročilými funkcemi, které zahrnují transakce, práci s grafovými daty a optimalizaci nákladů. Právě díky těmto funkcím se Cosmos DB stává silným nástrojem pro moderní aplikace, které vyžadují flexibilitu, škálovatelnost a vysoký výkon.

Jak správně synchronizovat přístup k sdíleným prostředkům v C#

V současnosti se v oblasti vícevláknového programování v C# stále více používají mechanizmy pro synchronizaci přístupu k sdíleným prostředkům. Cílem těchto mechanismů je zajistit, že více vláken nebude současně přistupovat k těmto prostředkům, čímž se předejde vzniku chyb a závodních podmínek. Jedním z nejběžnějších nástrojů pro tento účel je použití třídy Interlocked. Tato třída poskytuje atomické operace pro manipulaci s hodnotami v paměti. Avšak existují určité typy dat, které Interlocked nepodporuje, například typy byte, sbyte, short, ushort a decimal.

Mezi typy, které Interlocked podporuje, patří například:

  • System.Single (float)

  • System.Double (double)

  • nint, nuint

  • T, System.Object (object)

Pro ilustraci si představme příklad, kde chceme bezpečně inkrementovat počitadlo v multivláknovém prostředí. K tomu využijeme metodu Interlocked.Increment, která zajišťuje atomickou operaci:

csharp
public static int Counter; // další sdílený prostředek // V metodách A a B po modifikaci hodnoty řetězce přidáme: Interlocked.Increment(ref SharedObjects.Counter);

Tato operace zaručuje, že zvýšení hodnoty Counter probíhá bezpečně bez rizika konfliktu mezi vlákny. Při vykonání celkového počtu operací tak můžeme bezpečně zobrazit hodnotu:

csharp
WriteLine($"{SharedObjects.Counter} string modifications.");

Při pozorování výstupu uvidíme například následující:

vbnet
Please wait for the tasks to complete. ..........
Results: BBBBBAAAAA. 13,531 elapsed milliseconds. 10 string modifications.

Je důležité si ale uvědomit, že v tomto konkrétním případě ochrana sdílených prostředků pomocí objektu conch (blokování) je dostatečná, a použití Interlocked by v tomto konkrétním příkladu bylo nadbytečné. Pokud bychom však neměli chráněný jiný sdílený prostředek, například Message, použití Interlocked by bylo nezbytné.

Pokud jde o další možnosti synchronizace, monitorování a používání Interlocked jsou jednoduché, avšak v některých případech je nutné využít pokročilejší metody synchronizace, které umožňují efektivnější správu přístupu k více sdíleným prostředkům. Příkladem jsou typy jako ReaderWriterLock nebo Mutex, které se používají pro synchronizaci mezi procesy nebo pro lepší správu přístupu více vláken k jednomu prostředku.

Pokud se podíváme na některé pokročilejší synchronizační mechanizmy, můžeme narazit například na:

  • ReaderWriterLock a ReaderWriterLockSlim: Umožňují více vláknům číst současně, přičemž pouze jedno vlákno má výhradní právo pro zápis. To zlepšuje výkon v situacích, kdy je častý přístup pro čtení a méně častý pro zápis.

  • Mutex: Tento mechanismus poskytuje výhradní přístup ke sdílenému prostředku a je použitelný i mezi různými procesy.

  • Semaphore a SemaphoreSlim: Umožňují řídit počet vláken, které mohou současně přistupovat k určitému prostředku, čímž efektivně regulují přístup na základě počtu dostupných „slotů“.

  • AutoResetEvent a ManualResetEvent: Tento nástroj slouží k synchronizaci vláken, kde jedno vlákno signalizuje jinému vláknu, že může pokračovat.

Pokud se podíváme na další pokročilý koncept, který přináší C# 5, jsou to klíčová slova async a await. Tato klíčová slova byla zavedena k tomu, aby usnadnila práci s vícevláknovými aplikacemi, přičemž umožňují psát kód, který vypadá jako synchronní, ale běží asynchronně. Tento přístup je velmi užitečný pro zlepšení odezvy aplikací, zejména u GUI aplikací a webových služeb.

Například v případech, kdy chcete provést dlouhotrvající operace, například volání externího API, můžete použít:

csharp
HttpClient client = new(); HttpResponseMessage response = await client.GetAsync("http://www.apple.com/"); WriteLine("Apple's home page has {0:N0} bytes.", response.Content.Headers.ContentLength);

To zajistí, že program nebude blokovat UI vlákno, zatímco čeká na odpověď z webu, což zlepšuje celkovou reakční dobu aplikace.

Důležité je, že se v rámci asynchronního programování používá nový přístup ke streamům. Podpora asynchronních streamů, zavedená v .NET Core 3.0, umožňuje efektivní zpracování dat v reálném čase. Pomocí IAsyncEnumerable můžeme vracet hodnoty po částech, což umožňuje efektivní správu paměti a zpracování dat bez blokování vlákna.

Příklad:

csharp
async static IAsyncEnumerable<int> GetNumbersAsync() { Random r = Random.Shared; await Task.Delay(r.Next(1500, 3000)); yield return r.Next(0, 1001); await Task.Delay(r.Next(1500, 3000)); yield return r.Next(0, 1001); await Task.Delay(r.Next(1500, 3000)); yield return r.Next(0, 1001); }

Důležitým aspektem je i správné nastavení synchronizace při práci s GUI aplikacemi. V případě GUI aplikace je nutné dodržet dvě základní pravidla: nikdy neprovádět dlouhotrvající operace na hlavním vlákně uživatelského rozhraní a nikdy neprovádět přístup k UI prvkům z jiného vlákna než toho, které spravuje UI.

Pokud se však správně využijí async a await, mohou vývojáři psát kód, který vypadá synchronně, ale pod pokličkou běží efektivně asynchronně, čímž zůstává aplikace rychlá a responzivní.

Jak využít FluentValidation k validaci dat ve vaší aplikaci

Ve světě programování je validace dat klíčová pro zajištění správného fungování aplikace a ochrany integrity dat. Pro tento účel existují různé nástroje a knihovny, mezi nimiž se FluentValidation ukazuje jako jedna z nejúčinnějších a nejintuitivnějších metod. Tento nástroj nabízí možnosti pro definování pravidel validace, která jsou snadno čitelná a upravitelná, což výrazně usnadňuje práci s daty a jejich validací. Pojďme se podívat na to, jak využít FluentValidation při práci s daty v C# a jak ho implementovat do reálného projektu.

FluentValidation umožňuje definování silně typovaných validačních pravidel, která jsou vyjádřena přehledným a lidsky čitelným způsobem. Každé pravidlo validace je definováno v rámci třídy validátora, která dědí z AbstractValidator<T>, kde T je typ, jehož data chcete validovat. V konstruktoru validátora se volá metoda RuleFor, která specifikuje pravidla pro jednotlivé vlastnosti modelu.

FluentValidation přichází s řadou užitečných vestavěných rozšiřujících metod pro definování pravidel validace. Například můžete snadno validovat, zda je hodnota null nebo prázdná, zda má text správnou délku nebo zda číslo spadá do stanoveného rozsahu. Kromě těchto standardních validací existují i pokročilé metody pro práci s regulárními výrazy, e-maily, nebo čísly kreditních karet.

Pokud chcete provádět vlastní validace, můžete využít funkci Predicate, která umožňuje napsat vlastní validační funkci podle vašich potřeb. Pokud potřebujete ještě větší flexibilitu, můžete použít metodu Custom, která dává maximální kontrolu nad validací.

Další užitečnou funkcionalitou je možnost přizpůsobení chybových hlášení. FluentValidation nabízí několik metod pro změnu výchozích chybových zpráv, například WithName pro změnu názvu vlastnosti ve zprávě, WithSeverity pro nastavení závažnosti chyby, nebo WithMessage pro vlastní formátování chybové zprávy.

Abychom ukázali konkrétní implementaci, vytvoříme projekt, který bude validovat objednávky zákazníků. Tento projekt bude sestávat ze tří částí:

  1. Model pro objednávku – Tento model bude obsahovat informace jako je ID objednávky, jméno zákazníka, e-mail, celková cena, datum objednávky a datum doručení.

  2. Validátor pro tento model – Validátor bude definovat pravidla pro každý z těchto atributů, například zajištění, že jméno zákazníka není prázdné, že e-mail má správný formát, nebo že datum doručení je pozdější než datum objednávky.

  3. Aplikační logika pro testování validace – V této části provedeme validaci vytvořené objednávky a zobrazíme výsledky validace, včetně chybových zpráv, pokud nějaké existují.

Pro implementaci modelu použijeme enum pro úrovně zákazníka (Bronze, Silver, Gold) a definujeme třídu Order, která bude obsahovat všechny potřebné atributy objednávky. Dále vytvoříme validátor OrderValidator, který specifikuje pravidla pro validaci těchto atributů. Například, pokud je zákazník na úrovni Gold, cena objednávky musí být v rozmezí 20 až 50.

csharp
public class OrderValidator : AbstractValidator<Order> { public OrderValidator() { RuleFor(order => order.OrderId).NotEmpty(); RuleFor(order => order.CustomerName).NotNull().WithName("Name"); RuleFor(order => order.CustomerName).MinimumLength(5).WithSeverity(Severity.Warning); RuleFor(order => order.CustomerEmail).NotEmpty().EmailAddress(); RuleFor(order => order.CustomerLevel).IsInEnum(); RuleFor(order => order.Total).GreaterThan(0); RuleFor(order => order.ShipDate).GreaterThan(order => order.OrderDate); When(order => order.CustomerLevel == CustomerLevel.Gold, () => { RuleFor(order => order.Total).LessThan(50M); RuleFor(order => order.Total).GreaterThanOrEqualTo(20M); }).Otherwise(() => { RuleFor(order => order.Total).LessThan(20M); }); } }

V tomto kódu definujeme řadu validačních pravidel pro různé vlastnosti objednávky. Uvědomte si, že metody jako When a Otherwise umožňují přizpůsobit pravidla podle podmínek, které jsou závislé na hodnotách jiných vlastností.

Testování validátoru provedeme pomocí jednoduché aplikace, která vytvoří objednávku a zavolá metodu Validate, aby zkontrolovala, zda data splňují definovaná pravidla.

csharp
Order order = new Order
{ CustomerName = "John Doe", CustomerEmail = "[email protected]", CustomerLevel = CustomerLevel.Gold, Total = 30, OrderDate = DateTime.Now, ShipDate = DateTime.Now.AddDays(3) }; OrderValidator validator = new OrderValidator(); ValidationResult result = validator.Validate(order); WriteLine($"IsValid: {result.IsValid}");

Tato jednoduchá aplikace ukáže, zda objednávka odpovídá všem pravidlům validace, a poskytne podrobnosti o případných chybách.

FluentValidation poskytuje silný a flexibilní nástroj pro validaci dat, což je nezbytné pro každou aplikaci, která pracuje s uživatelskými vstupy nebo jinými datovými zdroji. Důležité je si uvědomit, že správná validace nejenže chrání aplikaci před chybnými daty, ale také zlepšuje uživatelskou zkušenost tím, že poskytuje jasné a srozumitelné chybové zprávy.