Azure DocumentDB ile .NET konsol uygulaması oluşturma

Bu kılavuzda, Bir Azure DocumentDB kümesine bağlanmak için bir .NET konsol uygulamasının nasıl derlenmesi gösterilmektedir. Geliştirme ortamınızı ayarlar, kimlik doğrulaması yapmak için .NET için Azure SDK kitaplığını kullanır Azure.Identity ve belgeleri oluşturmak, sorgulamak ve güncelleştirmek için veritabanıyla etkileşim kurarsınız.

Prerequisites

  • Mevcut bir Azure DocumentDB kümesi

Microsoft Entra kiracı meta verilerini alma

İçindeki TokenCredential sınıfını Azure.Identity kullanarak bir erişim belirteci almak için, Microsoft Entra kiracısının benzersiz kimliğine ihtiyacınız vardır. Bu önkoşul adımında, değeri almak ve kaydetmek için Azure CLI'yi tenantId kullanın.

  1. <şu anda oturum açmış durumda olan Azure aboneliğinin ayrıntılarını kullanarak alın.>

    az account show
    
  2. komutu, çeşitli alanları içeren bir JSON yanıtı oluşturur.

    {
      "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. özelliğinin tenantId değerini kaydedin. Bu özellik, Microsoft Entra kiracınız için benzersiz tanımlayıcıdır ve bazen kiracı kimliği olarak adlandırılır. Bu değeri sonraki bir bölümdeki adımlarda kullanacaksınız.

Konsol uygulamanızı yapılandırma

Ardından, yeni bir konsol uygulaması projesi oluşturun ve kümenizde kimlik doğrulaması yapmak için gerekli kitaplıkları içeri aktarın.

  1. Boş bir dizinde yeni bir .NET konsol uygulaması oluşturun.

    dotnet new console
    
  2. Azure.Identity Paketi NuGet'ten içeri aktarın.

    dotnet add package Azure.Identity
    
  3. Ardından paketi içeri aktarın MongoDB.Driver .

    dotnet add package MongoDB.Driver
    
  4. .NET projesini oluşturma

    dotnet build
    

Kümeye bağlanma

Şimdi kitaplığını Azure.IdentityTokenCredential kullanarak kümenize bağlanmak için bir kullanın. Resmi MongoDB sürücüsünün, kümeye bağlanırken kullanılmak üzere Microsoft Entra'dan belirteçleri almak için uygulanması gereken özel bir arabirimi vardır.

  1. Program.cs dosyasında bu Azure.Identity ve MongoDB.Driver ad alanları için using blokları ekleyin.

    using Azure.Identity;
    using MongoDB.Driver;
    
  2. Ayrı bir dosyada, MongoDB.Driver.Authentication.Oidc.IOidcCallback arayüzünün tüm gerekli üyelerini uygulayan yeni bir sınıf oluşturun.

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

    Tip

    Bu sınıf, açıklayıcı amaçlarla olarak olarak adlandırılır AzureIdentityTokenHandler. Bu sınıfa istediğiniz adı vekleyebilirsiniz. Bu kılavuzun geri kalanında sınıfın AzureIdentityTokenHandler adını taşıdığı varsayılır.

  3. Program.cs dosyasının düzenleyicisine geri dönün.

  4. Mevcut kümenizin adıyla bir dize değişkeni oluşturun. Daha sonra, MongoUrl kullanarak yeni bir MongoUrl.Create türü örneği oluşturmak için bu değişkeni kullanın.

    string clusterName = "<azure-documentdb-cluster-name>";
    
    MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
    
  5. Önceki adımlarda oluşturulan MongoSettings kullanarak ve Azure DocumentDB'nin standart en iyi uygulama yapılandırmasına uygun olarak yeni bir MongoUrl örneği yapılandırın.

    MongoClientSettings settings = MongoClientSettings.FromUrl(url);
    
    settings.UseTls = true;
    settings.RetryWrites = false;
    settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
    
  6. türünde DefaultAzureCredentialyeni bir kimlik bilgisi oluşturun.

    DefaultAzureCredential credential = new();
    

    Tip

    Burada, türünde TokenCredential herhangi bir kimlik bilgisi kullanabilirsiniz. DefaultAzureCredential erken geliştirme senaryoları için en sorunsuz seçenektir.

  7. Sınıfınızı uygulayan ve bu kılavuzun önceki bölümlerinde kaydettiğiniz IOidcCallback ile yapılandırılmış yeni bir örnek oluşturun.

    string tenantId = "<microsoft-entra-tenant-id>";
    
    AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
    
  8. Özelleştirilmiş işleyici geri çağırma uygulamanızı MongoCredential.CreateOidcCredential kullanarak ayarlarınız için kimlik bilgilerini yapılandırın.

    settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
    
  9. Ayarları dondurup yeni bir örneği MongoClientoluşturun.

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

Yaygın işlemler gerçekleştirme

Son olarak veritabanları, koleksiyonlar ve belgelerle ortak görevleri gerçekleştirmek için resmi kitaplığı kullanın. Burada, koleksiyonlarınızı ve öğelerinizi yönetmek için MongoDB veya DocumentDB ile etkileşimde bulunurken kullandığınız sınıfları ve yöntemleri kullanırsınız.

  1. Kendi dosyasında özel bir kayıt türü oluşturarak belgelerinizi temsil edin.

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

    Tip

    Bu yapı, açıklayıcı amaçlarla olarak olarak adlandırılır Product. Bu kılavuzun geri kalanında bu yapının önceden tanımlanmış olduğu varsayılır.

  2. Program.cs dosyasına geri dönün.

  3. Veritabanınıza bir işaretçi almak için MongoClient.GetDatabase kullanın.

    string databaseName = "<database-name>";
    
    IMongoDatabase database = client.GetDatabase(databaseName);
    
    Console.WriteLine("Database pointer created"); 
    
  4. Ardından, IMongoDatabase.GetCollection<> kullanarak koleksiyonunuz için bir işaretçi alabilmek için veritabanı işaretçisini kullanın.

    string collectionName = "<collection-name>";
    
    IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName);
    
    Console.WriteLine("Collection pointer created"); 
    
  5. yöntemini kullanarak iki belge oluşturun ve 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. IMongoCollection<>.Find ve IFindFluent<,>.SingleAsync kullanarak koleksiyondan tek bir belge okuyun. Bulmak istediğiniz belgeyi belirtmek için filtre kullanın.

    Product document = await collection.Find(
        doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd"
    ).SingleAsync();
    
    Console.WriteLine($"Found document:\t{document.name}");
    
  7. Aynı Find yöntemi kullanarak bir filtreyle eşleşen tüm belgeler için sorgu oluşturun. Belirli bir özelliği (örneğin category) ve belirli bir değeri (örneğin gear-surf-surfboards) tanımlamak için filtre kullanın. kullanarak IFindFluent<,>.ToListAsyncsonuçları numaralandırın.

    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. Belirli bir belgeyi, IMongoCollection<>.DeleteOneAsync ve bir filtre kullanarak koleksiyondan silin.

    await collection.DeleteOneAsync(
        doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc"
    );
    
    Console.WriteLine($"Deleted document");
    
  9. Projedeki tüm kod dosyalarını kaydedin.

  10. Projeyi dotnet run kullanarak çalıştır

    dotnet run
    
  11. Çalışan uygulamanın çıkışını gözlemleyin.

    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