Kurz: Vývoj konzolové aplikace .NET pomocí služby Azure Cosmos DB for NoSQL
PLATÍ PRO: NoSQL
Sada Azure SDK pro .NET umožňuje přidat data do kontejneru API pro NoSQL buď asynchronní jednotlivé operace , nebo transakční dávku. Tento kurz vás provede procesem vytvoření nové konzolové aplikace .NET, která do kontejneru přidá více položek.
V tomto kurzu se naučíte:
- Vytvoření databáze pomocí rozhraní API pro NoSQL
- Vytvoření konzolové aplikace .NET a přidání sady Azure SDK pro .NET
- Přidání jednotlivých položek do kontejneru API for NoSQL
- Efektivní načtení položek z kontejneru API pro NoSQL
- Vytvoření transakce s dávkovými změnami pro kontejner ROZHRANÍ API pro NoSQL
Požadavky
- Existující účet Azure Cosmos DB for NoSQL.
- Pokud máte existující předplatné Azure, vytvořte nový účet.
- Žádné předplatné Azure? Službu Azure Cosmos DB můžete vyzkoušet zdarma bez nutnosti platební karty.
- Visual Studio Code
- .NET 8 nebo novější
- Zkušenosti s psaním aplikací v jazyce C#.
Vytvoření rozhraní API pro prostředky NoSQL
Nejprve vytvořte prázdnou databázi v existujícím účtu rozhraní API pro NoSQL. Kontejner vytvoříte pomocí sady Azure SDK pro .NET později.
Na webu Azure Portal přejděte ke svému stávajícímu účtu API for NoSQL.
V nabídce prostředků vyberte Klíče.
Na stránce Klíče sledujte a poznamenejte hodnotu polí identifikátoru URI a PRIMÁRNÍ KLÍČ. Tyto hodnoty se používají v průběhu kurzu.
V nabídce prostředků vyberte Průzkumník dat.
Na stránce Průzkumník dat vyberte na panelu příkazů možnost Nová databáze.
V dialogovém okně Nová databáze vytvořte nový kontejner s následujícím nastavením:
Hodnota ID databáze cosmicworks
Typ propustnosti databáze Ruční Velikost propustnosti databáze 400
Vyberte OK a vytvořte databázi.
Vytvoření konzolové aplikace .NET
Teď vytvoříte novou konzolovou aplikaci .NET a naimportujete sadu Azure SDK pro .NET pomocí Microsoft.Azure.Cosmos
knihovny z NuGetu.
Otevřete terminál v prázdném adresáři.
Vytvoření nové konzolové aplikace pomocí
console
předdefinované šablonydotnet new console --langVersion preview
Přidejte verzi
Microsoft.Azure.Cosmos
balíčku verze 3.31.1-Preview z NuGetu.dotnet add package Microsoft.Azure.Cosmos --version 3.31.1-preview
Přidejte také předběžnou verzi
System.CommandLine
balíčku z NuGetu.dotnet add package System.CommandLine --prerelease
Humanizer
Přidejte také balíček z NuGetu.dotnet add package Humanizer
Sestavte projekt konzolové aplikace.
dotnet build
Otevřete Visual Studio Code pomocí aktuální složky projektu jako pracovního prostoru.
Tip
V terminálu můžete spustit
code .
visual Studio Code a automaticky otevřít pracovní adresář jako aktuální pracovní prostor.Přejděte na soubor Program.cs a otevřete ho. Odstraňte veškerý existující kód v souboru.
Přidejte tento kód do souboru pro použití knihovny System.CommandLine k analýze příkazového řádku pro dva řetězce předané prostřednictvím
--first
a--last
možností.using System.CommandLine; var command = new RootCommand(); var nameOption = new Option<string>("--name") { IsRequired = true }; var emailOption = new Option<string>("--email"); var stateOption = new Option<string>("--state") { IsRequired = true }; var countryOption = new Option<string>("--country") { IsRequired = true }; command.AddOption(nameOption); command.AddOption(emailOption); command.AddOption(stateOption); command.AddOption(countryOption); command.SetHandler( handle: CosmosHandler.ManageCustomerAsync, nameOption, emailOption, stateOption, countryOption ); await command.InvokeAsync(args);
Poznámka:
Pro účely tohoto kurzu není zcela důležité pochopit, jak analyzátor příkazového řádku funguje. Analyzátor má čtyři možnosti, které je možné zadat při spuštění aplikace. Tři z těchto možností jsou povinné, protože se použijí k vytvoření polí ID a klíče oddílu.
V tomto okamžiku se projekt nevytvoře, protože jste ještě nedefinovat statickou
CosmosHandler.ManageCustomerAsync
metodu.Uložte soubor Program.cs.
Přidání položek do kontejneru pomocí sady SDK
Dále pomocí jednotlivých operací přidáte položky do kontejneru API pro NoSQL. V této části definujete metodu CosmosHandler.ManageCustomerAsync
.
Vytvořte nový soubor CosmosHandler.cs .
Do souboru CosmosHandler.cs přidejte novou direktivu using pro obory
Humanizer
názvů aMicrosoft.Azure.Cosmos
obory názvů.using Humanizer; using Microsoft.Azure.Cosmos;
Vytvořte novou statickou třídu s názvem
CosmosHandler
.public static class CosmosHandler { }
Stačí ověřit, že tato aplikace funguje, vytvořte krátkou implementaci statické
ManageCustomerAsync
metody pro tisk vstupu příkazového řádku.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { await Console.Out.WriteLineAsync($"Hello {name} of {state}, {country}!"); }
Uložte soubor CosmosHandler.cs.
Zpátky v terminálu spusťte aplikaci.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Výstupem příkazu by měl být zábavný pozdrav.
Hello Mica Pereira of Washington, United States!
Vraťte se do souboru CosmosHandler.cs .
Ve statické třídě CosmosHandler přidejte nového
private static readonly
člena typuCosmosClient
s názvem_client
.private static readonly CosmosClient _client;
Vytvořte nový statický konstruktor pro
CosmosHandler
třídu.static CosmosHandler() { }
V rámci konstruktoru
CosmosClient
vytvořte novou instanci třídy, která předává dva parametry řetězce s hodnotami URI a PRIMARY KEY , které jste předtím zaznamenali v testovacím prostředí. Uložte tuto novou instanci do člena_client
.static CosmosHandler() { _client = new CosmosClient( accountEndpoint: "<uri>", authKeyOrResourceToken: "<primary-key>" ); }
Zpět ve statické třídě CosmosHandler vytvořte novou asynchronní metodu s názvem
GetContainerAsync
, která vrací .Container
private static async Task<Container> GetContainerAsync() { }
Pro další kroky přidejte tento kód do
GetContainerAsync
metody.cosmicworks
Získejte databázi a uložte ji do proměnné s názvemdatabase
.Database database = _client.GetDatabase("cosmicworks");
Vytvořte nový obecný typ
List<>
string
hodnot v seznamu hierarchických cest klíčů oddílu a uložte ho do proměnné s názvemkeyPaths
.List<string> keyPaths = new() { "/address/country", "/address/state" };
Vytvořte novou
ContainerProperties
proměnnou s názvem kontejneru (customers
) a seznamem cest klíče oddílu.ContainerProperties properties = new( id: "customers", partitionKeyPaths: keyPaths );
CreateContainerIfNotExistsAsync
Pomocí metody zadejte vlastnosti kontejneru a načtěte kontejner. Tato metoda podle názvu asynchronně vytvoří kontejner, pokud ještě v databázi neexistuje. Vrátí výsledek jako výstupGetContainerAsync
metody.return await database.CreateContainerIfNotExistsAsync( containerProperties: properties );
Odstraňte veškerý kód v rámci
ManageCustomerAsync
metody.Pro další kroky přidejte tento kód do
ManageCustomerAsync
metody.Asynchronní volání
GetContainerAsync
metody a uložení výsledku do proměnné s názvemcontainer
.Container container = await GetContainerAsync();
Vytvořte novou proměnnou s názvem
id
, která pomocíKebaberize
metody Humanizer transformujename
parametr metody.string id = name.Kebaberize();
Poznámka:
Metoda
Kebaberize
nahradí všechny mezery pomlčkami a konveruje text na malá písmena.Pomocí parametrů a parametrů metody a
country
proměnné vytvořte novou anonymní typovou položkuname
.id
state
Uložte položku jako proměnnou s názvemcustomer
.var customer = new { id = id, name = name, address = new { state = state, country = country } };
Pomocí asynchronní
CreateItemAsync
metody kontejneru vytvořte novou položku v kontejneru a přiřaďte metadata odpovědi HTTP proměnné s názvemresponse
.var response = await container.CreateItemAsync(customer);
Napište do konzoly hodnoty proměnných
response
StatusCode
aRequestCharge
vlastností. Zapište také hodnotuid
proměnné.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Uložte soubor CosmosHandler.cs.
Zpátky v terminálu spusťte aplikaci znovu.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Výstup příkazu by měl obsahovat stav a poplatek za operaci.
[Created] mica-pereira 7.05 RUs
Poznámka:
Poplatek za vaši žádost se může lišit.
Spusťte aplikaci ještě jednou.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Tentokrát by program měl dojít k chybovému ukončení. Pokud se posunete chybovou zprávou, zobrazí se chybové ukončení kvůli konfliktu v jedinečném identifikátoru položek.
Unhandled exception: Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: Conflict (409);Reason: ( Errors : [ "Resource with specified id or name already exists." ] );
Načtení položky pomocí sady SDK
Teď, když jste vytvořili první položku v kontejneru, můžete k načtení položky použít stejnou sadu SDK. Tady provedete dotaz a načtete položku a porovnáte rozdíl v spotřebě jednotek žádosti (RU).
Vraťte se do souboru CosmosHandler.cs nebo ho otevřete.
Odstraňte všechny řádky kódu z
ManageCustomerAsync
metody s výjimkou prvních dvou řádků.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Pro další kroky přidejte tento kód do
ManageCustomerAsync
metody.Pomocí asynchronní
CreateItemAsync
metody kontejneru vytvořte novou položku v kontejneru a přiřaďte metadata odpovědi HTTP proměnné s názvemresponse
.var response = await container.CreateItemAsync(customer);
Vytvořte nový řetězec s názvem
sql
dotazu SQL, který načte položky, ve kterých se filtr (@id
) shoduje.string sql = @" SELECT * FROM customers c WHERE c.id = @id ";
Vytvořte novou
QueryDefinition
proměnnou s názvemquery
předávajícísql
řetězec jako jediný parametr dotazu. Použijte také metoduWithParameter
tekutiny k použití hodnoty proměnnéid
na@id
parametr.var query = new QueryDefinition( query: sql ) .WithParameter("@id", id);
GetItemQueryIterator<>
Použijte obecnou metodu a proměnnou k vytvoření iterátoruquery
, který získává data ze služby Azure Cosmos DB. Uložte iterátor do proměnné s názvemfeed
. Zabalte tento celý výraz do příkazu using, aby se iterátor později vyřadil.using var feed = container.GetItemQueryIterator<dynamic>( queryDefinition: query );
Asynchronní volání
ReadNextAsync
metodyfeed
proměnné a uložení výsledku do proměnné s názvemresponse
.var response = await feed.ReadNextAsync();
Napište do konzoly hodnoty proměnných
response
StatusCode
aRequestCharge
vlastností. Zapište také hodnotuid
proměnné.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Uložte soubor CosmosHandler.cs.
Zpátky v terminálu spusťte aplikaci, aby přečetla jednu položku pomocí dotazu SQL.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Výstup příkazu by měl znamenat, že dotaz vyžadoval více jednotek žádostí (RU).
[OK] mica-pereira 2.82 RUs
Zpět v CosmosHandler.cs souboru odstraňte všechny řádky kódu z
ManageCustomerAsync
metody znovu s výjimkou prvních dvou řádků.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Pro další kroky přidejte tento kód do
ManageCustomerAsync
metody.Vytvořte novou instanci
PartitionKeyBuilder
tak, že přidátestate
parametrycountry
jako hodnotu klíče oddílu s více částmi.var partitionKey = new PartitionKeyBuilder() .Add(country) .Add(state) .Build();
Pomocí metody kontejneru
ReadItemAsync<>
nasměrujte na čtení položky z kontejneru pomocíid
proměnných.partitionKey
Uložte výsledek do proměnné s názvemresponse
.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey );
Napište do konzoly hodnoty proměnných
response
StatusCode
aRequestCharge
vlastností. Zapište také hodnotuid
proměnné.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RU");
Uložte soubor CosmosHandler.cs znovu.
Zpátky v terminálu spusťte aplikaci ještě jednou a nasměrujte tak čtení jedné položky.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Výstup příkazu by měl znamenat, že dotaz vyžadoval jednu RU.
[OK] mica-pereira 1 RUs
Vytvoření transakce pomocí sady SDK
Nakonec vezmete položku, kterou jste vytvořili, přečtete ji a vytvoříte jinou související položku jako součást jedné transakce pomocí sady Azure SDK pro .NET.
Vraťte se do souboru CosmosHandler.cs nebo ho otevřete.
Odstraňte tyto řádky kódu z
ManageCustomerAsync
metody.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey ); Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Pro další kroky přidejte tento nový kód do
ManageCustomerAsync
metody.Pomocí parametrů a parametrů metody a
country
proměnné vytvořte novou anonymní typovou položkuname
.id
state
Uložte položku jako proměnnou s názvemcustomerCart
. Tato položka představuje nákupní košík v reálném čase pro zákazníka, který je aktuálně prázdný.var customerCart = new { id = $"{Guid.NewGuid()}", customerId = id, items = new string[] {}, address = new { state = state, country = country } };
Pomocí parametrů a parametrů
id
metody acountry
proměnné vytvořte další novou anonymní typovou položkuname
.state
Uložte položku jako proměnnou s názvemcustomerCart
. Tato položka představuje expediční a kontaktní informace pro zákazníka.var customerContactInfo = new { id = $"{id}-contact", customerId = id, email = email, location = $"{state}, {country}", address = new { state = state, country = country } };
Vytvořte novou dávku pomocí metody kontejneru
CreateTransactionalBatch
, která předává proměnnoupartitionKey
. Uložte dávku do proměnné s názvembatch
. K provádění následujících akcí použijte fluentové metody:metoda Parametr ReadItem
id
řetězcová proměnnáCreateItem
customerCart
Proměnná anonymního typuCreateItem
customerContactInfo
Proměnná anonymního typuvar batch = container.CreateTransactionalBatch(partitionKey) .ReadItem(id) .CreateItem(customerCart) .CreateItem(customerContactInfo);
Ke spuštění transakce použijte metodu dávky
ExecuteAsync
. Uložte výsledek do proměnné s názvemresponse
.using var response = await batch.ExecuteAsync();
Napište do konzoly hodnoty proměnných
response
StatusCode
aRequestCharge
vlastností. Zapište také hodnotuid
proměnné.Console.WriteLine($"[{response.StatusCode}]\t{response.RequestCharge} RUs");
Uložte soubor CosmosHandler.cs znovu.
Zpátky v terminálu spusťte aplikaci ještě jednou a nasměrujte tak čtení jedné položky.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Výstup příkazu by měl zobrazit jednotky žádostí použité pro celou transakci.
[OK] 16.05 RUs
Poznámka:
Poplatek za vaši žádost se může lišit.
Ověření konečných dat v Průzkumníku dat
K zabalení dat použijete Průzkumník dat na webu Azure Portal k zobrazení dat a kontejneru, který jste vytvořili v tomto kurzu.
Na webu Azure Portal přejděte ke svému stávajícímu účtu API for NoSQL.
V nabídce prostředků vyberte Průzkumník dat.
Na stránce Průzkumník dat rozbalte
cosmicworks
databázi a pak vybertecustomers
kontejner.Na panelu příkazů vyberte Nový dotaz SQL.
V editoru dotazů sledujte tento řetězec dotazu SQL.
SELECT * FROM c
Výběrem příkazu Spustit dotaz spusťte dotaz a prohlédněte si výsledky.
Výsledky by měly obsahovat pole JSON se třemi položkami vytvořenými v tomto kurzu. Všimněte si, že všechny položky mají stejnou hierarchickou hodnotu klíče oddílu, ale jedinečná pole ID. Ukázkový výstup je zkrácen pro stručnost.
[ { "id": "mica-pereira", "name": "Mica Pereira", "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "33d03318-6302-4559-b5c0-f3cc643b2f38", "customerId": "mica-pereira", "items": [], "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "mica-pereira-contact", "customerId": "mica-pereira", "email": null, "location": "Washington, United States", "address": { "state": "Washington", "country": "United States" }, ... } ]
Vyčištění prostředků
Pokud už databázi použitou v tomto kurzu nepotřebujete, odstraňte ji. Uděláte to tak, že přejdete na stránku účtu, vyberete Průzkumník dat, vyberete cosmicworks
databázi a pak vyberete Odstranit.