Udostępnij za pomocą


Tworzenie aplikacji konsolowej platformy .NET przy użyciu usługi Azure DocumentDB

W tym przewodniku pokazano, jak utworzyć aplikację konsolową platformy .NET w celu nawiązania połączenia z klastrem usługi Azure DocumentDB. Skonfiguruj środowisko programistyczne, użyj biblioteki Azure.Identity z zestawu Azure SDK dla platformy .NET do uwierzytelniania i współpracuj z bazą danych, aby tworzyć, wykonywać zapytania i aktualizować dokumenty.

Wymagania wstępne

  • Subskrypcja platformy Azure

  • Istniejący klaster usługi Azure DocumentDB

  • Uwierzytelnianie Microsoft Entra zostało skonfigurowane dla klastra z przypisaną rolą dla Twojej tożsamości root.

  • Najnowsza wersja platformy .NET.

Pobieranie metadanych dzierżawy Microsoft Entra

Aby pobrać token dostępu przy użyciu klasy TokenCredential w programie Azure.Identity, potrzebny jest unikatowy identyfikator dla tenant Microsoft Entra. W tym kroku wymagań wstępnych użyj interfejsu wiersza polecenia platformy Azure, aby pobrać i zarejestrować tenantId wartość.

  1. Uzyskaj szczegółowe informacje dotyczące aktualnie zalogowanej subskrypcji platformy Azure przy użyciu polecenia az account show.

    az account show
    
  2. Polecenie zwraca odpowiedź JSON zawierającą różne pola.

    {
      "environmentName": "AzureCloud",
      "homeTenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "id": "dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b",
      "isDefault": true,
      "managedByTenants": [],
      "name": "example-azure-subscription",
      "state": "Enabled",
      "tenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "user": {
        "cloudShellID": true,
        "name": "kai@adventure-works.com",
        "type": "user"
      }
    }
    
  3. Zapisz wartość tenantId właściwości. Ta właściwość jest unikatowym identyfikatorem dzierżawcy Microsoft Entra i czasami jest nazywana identyfikatorem dzierżawcy. Ta wartość jest używana w ramach kroków w następnej sekcji.

Konfigurowanie aplikacji konsolowej

Następnie utwórz nowy projekt aplikacji konsolowej i zaimportuj niezbędne biblioteki do uwierzytelniania w klastrze.

  1. W pustym katalogu utwórz nową aplikację konsolową platformy .NET.

    dotnet new console
    
  2. Zaimportuj Azure.Identity pakiet z pakietu NuGet.

    dotnet add package Azure.Identity
    
  3. Następnie zaimportuj MongoDB.Driver pakiet.

    dotnet add package MongoDB.Driver
    
  4. Kompilowanie projektu platformy .NET

    dotnet build
    

Połącz się z klastrem

Teraz użyj biblioteki Azure.Identity, aby uzyskać TokenCredential, którego możesz użyć do połączenia się z klastrem. Oficjalny sterownik bazy danych MongoDB ma specjalny interfejs, który należy zaimplementować w celu uzyskania tokenów z firmy Microsoft Entra do użycia podczas nawiązywania połączenia z klastrem.

  1. W pliku Program.cs dodaj bloki dla tych Azure.Identity i MongoDB.Driver przestrzeni nazw.

    using Azure.Identity;
    using MongoDB.Driver;
    
  2. Utwórz nową klasę w osobnym pliku, która implementuje wszystkich wymaganych członków interfejsu MongoDB.Driver.Authentication.Oidc.IOidcCallback.

    using Azure.Core;
    using MongoDB.Driver.Authentication.Oidc;
    
    internal sealed class AzureIdentityTokenHandler(
        TokenCredential credential,
        string tenantId
    ) : IOidcCallback
    {
        private readonly string[] scopes = ["https://ossrdbms-aad.database.windows.net/.default"];
    
        public OidcAccessToken GetOidcAccessToken(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = credential.GetToken(
                new TokenRequestContext(scopes, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    
        public async Task<OidcAccessToken> GetOidcAccessTokenAsync(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = await credential.GetTokenAsync(
                new TokenRequestContext(scopes, parentRequestId: null, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    }
    

    Wskazówka

    W celach ilustracyjnych ta klasa nosi nazwę AzureIdentityTokenHandler. Możesz nazwać tę klasę wszystkim, co chcesz. W pozostałej części tego przewodnika założono, że klasa nosi nazwę AzureIdentityTokenHandler.

  3. Wróć do edytora dla pliku Program.cs .

  4. Utwórz zmienną ciągu o nazwie istniejącego klastra. Następnie użyj tej zmiennej, aby utworzyć nowe wystąpienie typu MongoUrl przy użyciu polecenia MongoUrl.Create

    string clusterName = "<azure-documentdb-cluster-name>";
    
    MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
    
  5. Skonfiguruj nowe MongoSettings wystąpienie przy użyciu MongoUrl, które utworzono w poprzednich krokach, oraz standardowej konfiguracji najlepszych praktyk dla usługi Azure DocumentDB.

    MongoClientSettings settings = MongoClientSettings.FromUrl(url);
    
    settings.UseTls = true;
    settings.RetryWrites = false;
    settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
    
  6. Utwórz nowe poświadczenie typu DefaultAzureCredential.

    DefaultAzureCredential credential = new();
    

    Wskazówka

    W tym miejscu możesz użyć dowolnego poświadczenia typu TokenCredential . DefaultAzureCredential jest najbardziej bezproblemową opcją dla scenariuszy wczesnego programowania.

  7. Utwórz nowe wystąpienie swojej klasy, które implementuje IOidcCallback i skonfiguruj je za pomocą identyfikatora dzierżawy, który zanotowałeś wcześniej w tym przewodniku.

    string tenantId = "<microsoft-entra-tenant-id>";
    
    AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
    
  8. Skonfiguruj poświadczenia dla swoich ustawień za pomocą MongoCredential.CreateOidcCredential i przekazując własną implementację funkcji callback programu obsługi.

    settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
    
  9. Zablokuj ustawienia, a następnie utwórz nową instancję MongoClient.

    settings.Freeze();
    
    MongoClient client = new(settings);
    
    Console.WriteLine("Client created");
    

Wykonywanie typowych operacji

Na koniec użyj oficjalnej biblioteki do wykonywania typowych zadań z bazami danych, kolekcjami i dokumentami. W tym miejscu użyjesz tych samych klas i metod, których należy użyć do interakcji z bazą danych MongoDB lub DocumentDB w celu zarządzania kolekcjami i elementami.

  1. Przedstaw swoje dokumenty, tworząc niestandardowy typ rekordu we własnym pliku.

    public record Product(
        string id,
        string category,
        string name,
        int quantity,
        decimal price,
        bool clearance
    );
    

    Wskazówka

    W celach ilustracyjnych ta struktura nosi nazwę Product. W pozostałej części tego przewodnika założono, że ta struktura jest już zdefiniowana.

  2. Wróć do pliku Program.cs .

  3. Uzyskaj wskaźnik do swojej bazy danych przy użyciu MongoClient.GetDatabase.

    string databaseName = "<database-name>";
    
    IMongoDatabase database = client.GetDatabase(databaseName);
    
    Console.WriteLine("Database pointer created"); 
    
  4. Następnie użyj wskaźnika bazy danych, aby uzyskać wskaźnik do kolekcji używając IMongoDatabase.GetCollection<>.

    string collectionName = "<collection-name>";
    
    IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName);
    
    Console.WriteLine("Collection pointer created"); 
    
  5. Utwórz i zaktualizuj lub wstaw dwa dokumenty przy użyciu metody IMongoCollection<>.ReplaceOneAsync.

    Product classicSurfboard = new(
        id: "bbbbbbbb-1111-2222-3333-cccccccccccc",
        category: "gear-surf-surfboards",
        name: "Kiama Classic Surfboard",
        quantity: 25,
        price: 790.00m,
        clearance: false
    );
    
    Product paddleKayak = new(
        id: "cccccccc-2222-3333-4444-dddddddddddd",
        category: "gear-paddle-kayaks",
        name: "Lastovichka Paddle Kayak",
        quantity: 10,
        price: 599.99m,
        clearance: true
    );
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == classicSurfboard.id,
        classicSurfboard,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{classicSurfboard.id}");
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == paddleKayak.id,
        paddleKayak,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{paddleKayak.id}");
    
  6. Odczytywanie pojedynczego dokumentu z kolekcji przy użyciu elementów IMongoCollection<>.Find i IFindFluent<,>.SingleAsync. Użyj filtru, aby określić konkretny dokument, który chcesz znaleźć.

    Product document = await collection.Find(
        doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd"
    ).SingleAsync();
    
    Console.WriteLine($"Found document:\t{document.name}");
    
  7. Wykonaj zapytanie o wszystkie dokumenty zgodne z filtrem przy użyciu tej samej Find metody. Użyj filtru, aby zdefiniować określoną właściwość (na przykład category) i określoną wartość (na przykład gear-surf-surfboards). Wyliczanie wyników przy użyciu polecenia IFindFluent<,>.ToListAsync.

    List<Product> documents = await collection.Find(
        doc => doc.category == "gear-surf-surfboards"
    ).ToListAsync();
    
    foreach (Product doc in documents)
    {
        Console.WriteLine($"Queried document:\t{doc}");
    }
    
  8. Usuń określony dokument z kolekcji, korzystając z IMongoCollection<>.DeleteOneAsync i filtra.

    await collection.DeleteOneAsync(
        doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc"
    );
    
    Console.WriteLine($"Deleted document");
    
  9. Zapisz wszystkie pliki kodu w projekcie.

  10. Uruchamianie projektu przy użyciu polecenia dotnet run

    dotnet run
    
  11. Obserwuj dane wyjściowe uruchomionej aplikacji.

    Client created
    Database pointer created
    Collection pointer created
    Upserted document:      bbbbbbbb-1111-2222-3333-cccccccccccc
    Upserted document:      cccccccc-2222-3333-4444-dddddddddddd
    Found document: Lastovichka Paddle Kayak
    Queried document:       Product { id = bbbbbbbb-1111-2222-3333-cccccccccccc, category = gear-surf-surfboards, name = Kiama Classic Surfboard, quantity = 25, price = 790.00, clearance = False }
    Deleted document