Compartilhar via


Criar um aplicativo de console do .NET com o Azure DocumentDB

Este guia demonstra como criar um aplicativo de console do .NET para se conectar a um cluster do Azure DocumentDB. Configure seu ambiente de desenvolvimento, use a Azure.Identity biblioteca do SDK do Azure para .NET para autenticação e interaja com o banco de dados para criar, consultar e atualizar documentos.

Pré-requisitos

  • Uma assinatura do Azure

    • Se você não tiver uma assinatura do Azure, crie uma conta gratuita
  • Um cluster existente do Azure DocumentDB

  • Autenticação do Microsoft Entra configurada para o cluster com sua identidade concedida à função root.

  • Versão mais recente do .NET.

Recuperar metadados do locatário do Microsoft Entra

Para recuperar um token de acesso usando a classe TokenCredential em Azure.Identity, você precisa do identificador exclusivo do locatário do Microsoft Entra. Nesta etapa de pré-requisito, use a CLI do Azure para recuperar e registrar o tenantId valor.

  1. Obtenha os detalhes da assinatura do Azure atualmente conectada usando az account show.

    az account show
    
  2. O comando gera uma resposta JSON contendo vários campos.

    {
      "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. Registre o valor da propriedade tenantId. Essa propriedade é o identificador exclusivo do locatário do Microsoft Entra e, às vezes, é conhecida como a ID do locatário. Use esse valor em etapas em uma seção subsequente.

Configurar seu aplicativo de console

Em seguida, crie um novo projeto de aplicativo de console e importe as bibliotecas necessárias para autenticar no cluster.

  1. Em um diretório vazio, crie um novo aplicativo de console do .NET.

    dotnet new console
    
  2. Importe o Azure.Identity pacote do NuGet.

    dotnet add package Azure.Identity
    
  3. Em seguida, importe o MongoDB.Driver pacote.

    dotnet add package MongoDB.Driver
    
  4. Criar o projeto .NET

    dotnet build
    

Conectar-se ao cluster

Agora, use a biblioteca Azure.Identity para obter uma TokenCredential a ser usada para conectar-se ao cluster. O driver oficial do MongoDB tem uma interface especial que deve ser implementada para obter tokens do Microsoft Entra para uso ao se conectar ao cluster.

  1. No arquivo Program.cs, adicione blocos de uso para esses Azure.Identity e MongoDB.Driver namespaces.

    using Azure.Identity;
    using MongoDB.Driver;
    
  2. Crie uma nova classe em um arquivo separado que implemente todos os membros necessários da MongoDB.Driver.Authentication.Oidc.IOidcCallback interface.

    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);
        }
    }
    

    Dica

    Para fins ilustrativos, essa classe é denominada AzureIdentityTokenHandler. Você pode nomear essa classe como quiser. O restante deste guia pressupõe que a classe seja nomeada AzureIdentityTokenHandler.

  3. Volte para o editor do arquivo Program.cs .

  4. Crie uma variável de cadeia de caracteres com o nome do cluster existente. Em seguida, use essa variável para criar uma nova instância do tipo MongoUrl usando MongoUrl.Create

    string clusterName = "<azure-documentdb-cluster-name>";
    
    MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
    
  5. Configure uma nova MongoSettings instância usando o MongoUrl criado nas etapas anteriores e a configuração de prática recomendada padrão para o Azure DocumentDB.

    MongoClientSettings settings = MongoClientSettings.FromUrl(url);
    
    settings.UseTls = true;
    settings.RetryWrites = false;
    settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
    
  6. Crie uma nova credencial do tipo DefaultAzureCredential.

    DefaultAzureCredential credential = new();
    

    Dica

    Você pode usar qualquer credencial do tipo TokenCredential aqui. DefaultAzureCredential é a opção mais sem atrito para cenários de desenvolvimento precoce.

  7. Crie uma nova instância de sua classe que implementa IOidcCallback e configure-a com o ID do locatário que você registrou anteriormente neste guia.

    string tenantId = "<microsoft-entra-tenant-id>";
    
    AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
    
  8. Configure a credencial para suas configurações usando MongoCredential.CreateOidcCredential e passando sua implementação de retorno de chamada de manipulador personalizada.

    settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
    
  9. Congele as configurações e, em seguida, crie uma nova instância de MongoClient.

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

Executar operações comuns

Por fim, use a biblioteca oficial para executar tarefas comuns com bancos de dados, coleções e documentos. Aqui, você usa as mesmas classes e métodos que usaria para interagir com MongoDB ou DocumentDB para gerenciar suas coleções e itens.

  1. Represente seus documentos criando um tipo de registro personalizado em seu próprio arquivo.

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

    Dica

    Para fins ilustrativos, esse struct é nomeado Product. O restante deste guia pressupõe que você já tenha esse struct definido.

  2. Volte para o arquivo Program.cs .

  3. Obtenha um ponteiro para o banco de dados usando MongoClient.GetDatabase.

    string databaseName = "<database-name>";
    
    IMongoDatabase database = client.GetDatabase(databaseName);
    
    Console.WriteLine("Database pointer created"); 
    
  4. Em seguida, use o ponteiro do banco de dados para obter um ponteiro para a coleção usando IMongoDatabase.GetCollection<>.

    string collectionName = "<collection-name>";
    
    IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName);
    
    Console.WriteLine("Collection pointer created"); 
    
  5. Crie e insira dois documentos usando o IMongoCollection<>.ReplaceOneAsync método.

    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. Ler um único documento da coleção usando IMongoCollection<>.Find e IFindFluent<,>.SingleAsync. Use um filtro para especificar o documento específico que você gostaria de encontrar.

    Product document = await collection.Find(
        doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd"
    ).SingleAsync();
    
    Console.WriteLine($"Found document:\t{document.name}");
    
  7. Consulte todos os documentos que correspondem a um filtro usando o mesmo Find método. Use um filtro para definir uma propriedade específica (como category) e um valor específico (como gear-surf-surfboards). Enumerar os resultados usando 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. Exclua um documento específico da coleção usando IMongoCollection<>.DeleteOneAsync e um filtro.

    await collection.DeleteOneAsync(
        doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc"
    );
    
    Console.WriteLine($"Deleted document");
    
  9. Salve todos os arquivos de código no projeto.

  10. Executar o projeto usando dotnet run

    dotnet run
    
  11. Observe a saída do aplicativo em execução.

    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