Cvičení – Připojení do Azure Cosmos DB for NoSQL

Dokončeno

Třída CosmosDbService obsahuje implementaci zástupných procedur služby podobné OpenAiService třídě, na které jste dříve pracovali v tomto modulu. Naproti tomu tato třída používá sadu .NET SDK pro službu Azure Cosmos DB, která se mírně liší.

V tomto cvičení je potřeba splnit několik klíčových požadavků:

  • Import sady .NET SDK pro Azure Cosmos DB pro NoSQL
  • Přidání koncového bodu a klíče služby Azure Cosmos DB for NoSQL do nastavení aplikace
  • Úprava třídy služby s různými členy a instancí klienta

Import sady .NET SDK

Balíček Microsoft.Azure.Cosmos NuGet je typová knihovna, která zjednodušuje proces přístupu ke službě Azure Cosmos DB for NoSQL z aplikace .NET.

  1. Otevřete nový terminál.

  2. Importujte Microsoft.Azure.Cosmos balíček z NuGetu pomocí dotnet add package.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Vytvořte projekt .NET ještě jednou.

    dotnet build
    
  4. Zavřete terminál.

Přidání nastavení aplikace

Znovu použijte appsettings.Development.json soubor k zadání aktuálních hodnot pro koncový bod a klíč Azure Cosmos DB for NoSQL.

  1. Otevřete nastavení aplikace. Soubor Development.json.

  2. V souboru vytvořte další nový objekt JSON se zástupnou vlastností pro CosmosDb nastavení.

    {
      "OpenAi": {
        "Endpoint": "<your-azure-openai-endpoint>",
        "Key": "<your-azure-openai-key>"
      },
      "CosmosDb": {
      }
    }
    
  3. V rámci CosmosDb vlastnosti vytvořte dvě nové vlastnosti pro objekt Endpoint a Key. Použijte nastavení koncového bodu a klíče služby Azure Cosmos DB, které jste si poznamenali dříve v tomto projektu.

    {
      "OpenAi": {
        "Endpoint": "<your-azure-openai-endpoint>",
        "Key": "<your-azure-openai-key>"
      },
      "CosmosDb": {
        "Endpoint": "<your-azure-cosmos-db-endpoint>",
        "Key": "<your-azure-cosmos-db-key>"
      }
    }
    

    Za předpokladu, že název účtu služby Azure Cosmos DB je nybncrsna76fo-cosmos-nosql a klíč je Aj2OSQqWhXfFzkITIi4MIbocWAAoBCUWnSPzHlQbDYA3TiyZCJlk8A6R1l6WqD45BxAG5vrsyQ4SCXEkPS1pLh==, nakonfigurujete objekt JSON jako v tomto příkladu.

    {
      "OpenAi": {
        "Endpoint": "<your-azure-openai-endpoint>",
        "Key": "<your-azure-openai-key>"
      },
      "CosmosDb": {
        "Endpoint": "https://nybncrsna76fo-cosmos-nosql.documents.azure.com:443/",
        "Key": "Aj2OSQqWhXfFzkITIi4MIbocWAAoBCUWnSPzHlQbDYA3TiyZCJlk8A6R1l6WqD45BxAG5vrsyQ4SCXEkPS1pLh=="
      }
    }
    

    Poznámka:

    Klíč v tomto příkladu je fiktivní.

  4. Uložte nastavení aplikace. Soubor Development.json.

Přidání požadovaných členů a instance klienta

Nakonec implementujte proměnné třídy a klienta potřebné pro přístup ke službě Azure Cosmos DB for NoSQL pomocí klienta. V tomto kroku použijte klientské třídy sady SDK k implementaci instance typu Container ve CosmosDbService třídě.

  1. Otevřete soubor Services/CosmosDbService.cs.

  2. Přidejte direktivy using pro následující obory názvů.

    • Microsoft.Azure.Cosmos

    • Microsoft.Azure.Cosmos.Fluent

    using Microsoft.Azure.Cosmos;
    using Microsoft.Azure.Cosmos.Fluent;
    
  3. V rámci CosmosDbService třídy přidejte novou Containerproměnnou -typed s názvem _container.

    private readonly Container _container;
    
  4. V rámci konstruktoru přidejte ArgumentNullException.ThrowIfNullOrEmpty kontroly pro vyvolání chyby, pokud jsou endpoint key parametry null.

    ArgumentNullException.ThrowIfNullOrEmpty(endpoint);
    ArgumentNullException.ThrowIfNullOrEmpty(key);
    
  5. Nyní vytvořte proměnnou s názvem options typu CosmosSerializationOptions. PropertyNamingPolicy Nastavte vlastnost proměnné na CosmosPropertyNamingPolicy.CamelCasehodnotu .

    CosmosSerializationOptions options = new()
    {
        PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
    };
    

    Poznámka:

    Nastavením této vlastnosti zajistíte, že json vytvořený sadou SDK je serializován i deserializován v případě camel bez ohledu na to, jak je odpovídající vlastnost cased ve třídě .NET.

  6. Vytvořte novou instanci typu CosmosClient pojmenovanou client pomocí CosmosClientBuilder možností třídy, koncového bodu, klíče a serializace, které jste zadali dříve.

    CosmosClient client = new CosmosClientBuilder(endpoint, key)
        .WithSerializerOptions(options)
        .Build();
    
  7. Vytvořte novou proměnnou s možnou hodnotou null typu Database pojmenovanou database voláním GetDatabase metody klientské proměnné.

    Database? database = client?.GetDatabase(databaseName);
    
  8. Vytvořte další proměnnou s možnou hodnotou null s názvem container typu Container voláním GetContainer metody databázové proměnné.

    Container? container = database?.GetContainer(containerName);
    
  9. Nakonec přiřaďte proměnnou konstruktoru container proměnné třídy _container pouze v případě, že není null. Pokud má hodnotu null, vyvoláte výjimku ArgumentException.

    _container = container ??
        throw new ArgumentException("Unable to connect to existing Azure Cosmos DB container or database.");
    

    Tip

    Tento blok kódu používá operátor nulového sjednocení ke kontrole, jestli je proměnná před provedením přiřazení null.

  10. Uložte soubor Services/CosmosDbService.cs.

Kontrola práce

V tomto okamžiku by měl konstruktor obsahovat dostatečnou logiku k vytvoření instance kontejneru, kterou používá zbytek služby. Vzhledem k tomu, že třída ještě s kontejnerem nic nedělá, neexistuje žádný bod ve spuštění webové aplikace, ale při sestavování aplikace je hodnota, aby se zajistilo, že váš kód nemá žádné vynechání ani chyby.

  1. Otevřete nový terminál.

  2. Sestavte projekt .NET.

    dotnet build
    
  3. Prohlédněte si výstup sestavení a zkontrolujte, jestli nedošlo k žádným chybám sestavení.

    MSBuild version 17.5.1+f6fdcf537 for .NET
      Determining projects to restore...
      All projects are up-to-date for restore.
      cosmoschatgpt -> /workspaces/cosmosdb-chatgpt/bin/Debug/net8.0/cosmoschatgpt.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:06.45
    
  4. Zavřete terminál.