Oefening: databaseservices gebruiken om gegevens van een .NET Aspire-project op te slaan

Voltooid

In deze oefening vervangt u de huidige gegevensarchieven voor de cloudeigen app van uw bedrijf. Op dit moment maakt de app gebruik van een lokaal opgeslagen SQLite-database voor catalogusgegevens en een in-memory Redis-cache voor winkelmandjes van de klant. U vervangt de bestaande gegevensarchieven door PostgreSQL en MongoDB.

Vereiste onderdelen installeren

De vereisten voor .NET Aspire zijn:

  • .NET 8
  • Visual Studio 2022 Preview
  • Docker Desktop of Podman
  • .NET Aspire-workload in Visual Studio

Als u de vereisten al hebt geïnstalleerd, kunt u verdergaan met het klonen van de bestaande app.

.NET 8 installeren

Volg deze .NET 8-koppeling en selecteer het juiste installatieprogramma voor uw besturingssysteem. Als u bijvoorbeeld Windows 11 en een moderne processor gebruikt, selecteert u de x64 .NET 8 SDK voor Windows.

Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies. Voer in een terminalvenster de volgende opdracht uit om te controleren of de installatie is geslaagd:

dotnet --version

U ziet nu het versienummer van de .NET SDK die u hebt geïnstalleerd. Voorbeeld:

8.0.300-preview.24203.14

Visual Studio 2022 Preview installeren

Volg deze koppeling naar Visual Studio 2022 Preview en selecteer Voorbeeld downloaden. Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies.

Docker Desktop installeren

Volg deze Docker Desktop-koppeling en selecteer het juiste installatieprogramma voor uw besturingssysteem. Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies.

Open de Docker Desktop-toepassing en accepteer de serviceovereenkomst.

De workload .NET Aspire installeren in Visual Studio

Installeer de .NET Aspire-workload met behulp van de .NET CLI:

  1. Open een terminal.

  2. Installeer de .NET Aspire-workloads met deze opdrachten:

    dotnet workload update
    dotnet workload install aspire
    dotnet workload list
    

    U ziet nu de details van de workload .NET Aspire.

     Installed Workload Id      Manifest Version      Installation Source
    ---------------------------------------------------------------------------------------------
    aspire                     8.0.0/8.0.100         SDK 8.0.300-preview.24203, VS 17.10.34902.84
    
    Use `dotnet workload search` to find additional workloads to install.
    

De app Northern Mountains klonen en wijzigen

Laten we de git huidige Northern Mountains-app verkrijgen:

  1. Blader in de opdrachtregel naar een map van uw keuze waar u met code kunt werken.

  2. Voer de volgende opdracht uit om de Northern Mountains eShop-voorbeeldtoepassing te klonen:

    git clone -b aspire-databases https://github.com/MicrosoftDocs/mslearn-aspire-starter
    
  3. Start Visual Studio en selecteer vervolgens Een project of oplossing openen.

  4. Blader naar de map waarin u de eShop hebt gekloond, open de startmap en selecteer het eShop.databases.sln bestand en selecteer vervolgens Openen.

  5. Vouw in Solution Explorer het project eShop.AppHost uit en open Program.cs.

    // Databases
    
    var basketStore = builder.AddRedis("BasketStore").WithRedisCommander();
    
    // Identity Providers
    
    var idp = builder.AddKeycloakContainer("idp", tag: "23.0")
        .ImportRealms("../Keycloak/data/import");
    
    // DB Manager Apps
    
    builder.AddProject<Projects.Catalog_Data_Manager>("catalog-db-mgr");
    
    // API Apps
    
    var catalogApi = builder.AddProject<Projects.Catalog_API>("catalog-api");
    
    var basketApi = builder.AddProject<Projects.Basket_API>("basket-api")
            .WithReference(basketStore)
            .WithReference(idp);
    
    // Apps
    
    // Force HTTPS profile for web app (required for OIDC operations)
    var webApp = builder.AddProject<Projects.WebApp>("webapp")
        .WithReference(catalogApi)
        .WithReference(basketApi)
        .WithReference(idp, env: "Identity__ClientSecret");
    

    De vorige code toont de huidige configuratie voor de app. De app maakt gebruik van een Redis-cache voor de winkelwagen.

  6. Verken de rest van de app, richt u op de projecten Catalog.Data.Manager en Catalog.API en bekijk hoe ze een lokaal opgeslagen SQLite-database gebruiken.

  7. Als u de app wilt starten, drukt u op F5 of selecteert u Foutopsporing >starten.

  8. Als het dialoogvenster Docker Desktop starten wordt weergegeven, selecteert u Ja.

  9. Wanneer het dashboard eShop .NET Aspire wordt weergegeven, selecteert u voor de web-app-resource het beveiligde eindpunt:

    Een schermopname van het eShop .NET Aspire-dashboard. Het eindpunt van de web-app is gemarkeerd.

  10. De app wordt geopend in een browser. U kunt de app verkennen en zien hoe deze werkt.

    Een schermopname van de startpagina van eShop.

    De referenties van de testgebruiker zijn test@example.com en P@$$w 0rd1.

  11. Als u de foutopsporing wilt stoppen, drukt u op Shift+F5 of selecteert u Foutopsporing >stoppen.

Een .NET Aspire PostgreSQL-onderdeel toevoegen

Het team dat verantwoordelijk is voor de catalogusmicroservices heeft de app gebouwd voor het gebruik van een lokaal opgeslagen SQLite-database. Deze aanpak is prima voor ontwikkeling, maar het team wil een robuustere database gebruiken voor productie.

Twee projecten maken verbinding met de SQLite-database, de Catalog.Data.Manager - en Catalog.API-projecten . De gegevensbeheerder wordt alleen gebruikt om de database te seeden met gegevens, dus u moet zich richten op het Catalog.API-project .

  1. Klik in Solution Explorer met de rechtermuisknop op het catalog.API-project en selecteer add.NET> Aspire-pakket.

  2. Voeg in het zoekvak Npgsql.EntityFramework toe aan het einde en druk op Enter.

  3. Selecteer aan de linkerkant , in de resultaten, Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.

  4. Selecteer aan de rechterkant de vervolgkeuzelijst versie en selecteer vervolgens de meest recente versie van 8.0.0 .

  5. Selecteer Installeren.

  6. Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.

  7. Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.

  8. Selecteer in Solution Explorer het Project Catalog.API om de inhoud van het bestand Catalog.API.csproj weer te geven.

  9. Verwijder het PackageReference voor Microsoft.EntityFrameworkCore.Sqlite:

    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.3" />
    

De nieuwe PostgreSQL DbContext registreren

  1. Vouw in Solution Explorer het project Catalog.API uit en open het Program.cs-bestand .

  2. Vervang SQLite DbContext:

    builder.Services.AddDbContext<CatalogDbContext>(
         options => options.UseSqlite(builder.Configuration.GetConnectionString("sqlconnection")
     	    ?? throw new InvalidOperationException(
     		    "Connection string 'sqlconnection' not found.")));
    

    Met de nieuwe PostgreSQL DbContext:

    builder.AddNpgsqlDbContext<CatalogDbContext>("CatalogDB");
    

    De app hoeft het Database.db bestand niet meer te lezen, dus verwijder de bijbehorende tekenreeksen in appsettings.json.

  3. Selecteer in Solution Explorer onder Catalog.API appsettings.json.

  4. Verwijder de ConnectionStrings vermeldingen, het bestand ziet er nu als volgt uit:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "OpenApi": {
        "Endpoint": {
          "Name": "Catalog.API v1"
        },
        "Document": {
          "Description": "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
          "Title": "eShop - Catalog HTTP API",
          "Version": "v1"
        }
      },
      "CatalogOptions": {
        "PicBasePathFormat": "items/{0}/pic/"
      }
    }
    
    
  5. Klik met de rechtermuisknop op het project Catalog.Data.Manager en selecteer Verwijderen.

  6. Selecteer OK in het dialoogvenster.

Het databaseteam maakt een PostgreSQL-databaseback-up die u kunt gebruiken om de catalogusdatabase te maken en te seeden. U kunt de back-up bekijken in de map Catalog.API/Seed .

De PostgreSQL-database seeden met behulp van een afhankelijk volume

Het AppHost-project kan een PostgreSQL-databasecontainer maken, deze seeden met gegevens van een gebonden volume en vervolgens via verwijzingen naar afhankelijkheidsinjectie doorgeven aan de Catalog.API.

  1. Klik in Solution Explorer met de rechtermuisknop op het project eShop.AppHost en selecteer Add.NET> Aspire package.

  2. Voeg PostgreSQL toe aan het einde in het zoekvak en druk op Enter.

  3. Selecteer Aan de linkerkant , in de resultaten, De optie Aspire.Hosting.PostgreSQL.

  4. Selecteer aan de rechterkant de vervolgkeuzelijst versie en selecteer vervolgens de meest recente versie van 8.0.0 .

  5. Selecteer Installeren.

  6. Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.

  7. Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.

  8. Vouw in Solution Explorer het project eShop.AppHost uit en open het Program.cs bestand.

  9. Voeg onder de //Databases opmerking de volgende code toe:

    // Databases
    
    var basketStore = builder.AddRedis("BasketStore").WithRedisCommander();
    var postgres = builder.AddPostgres("postgres")
        .WithEnvironment("POSTGRES_DB", "CatalogDB")
        .WithBindMount("../Catalog.API/Seed", "/docker-entrypoint-initdb.d").WithPgAdmin();
    var catalogDB = postgres.AddDatabase("CatalogDB");
    

    Met de vorige code wordt een PostgreSQL-databasecontainer gemaakt, een database met de naam CatalogDB toegevoegd en wordt de map /docker-entrypoint-initdb.d gekoppeld aan de .. /Catalog.API/Seed directory. De code maakt ook een container voor het pgAdmin-hulpprogramma waarmee u de PostgreSQL-database kunt beheren.

  10. Geef de catalogDB verwijzing door naar het Catalog.API-project door toe te voegen .WithReference(catalogDB), de code is nu:

    // API Apps
    
    var catalogApi = builder.AddProject<Projects.Catalog_API>("catalog-api")
      .WithReference(catalogDB); 
    
  11. Het project Catalog.Data.Manager is niet meer nodig, dus verwijder het project uit de AppHost. Verwijder deze code:

    // DB Manager Apps
    
    builder.AddProject<Projects.Catalog_Data_Manager>("catalog-db-mgr");
    

De app testen

Met .NET Aspire kon uw team een heel project verwijderen. Bovendien heeft de catalogus-API slechts één regel code nodig om de PostgresSQL-databasecontext toe te voegen. Afhankelijkheidsinjectie en servicedetectie van de AppHost betekenen dat er geen andere codewijzigingen nodig zijn om de API verbinding te laten maken met de nieuwe database.

  1. Compileer en start de app, druk op F5 of selecteer Foutopsporing >starten.

    Een schermopname van het bijgewerkte .NET Aspire-dashboard, met de twee nieuwe PostgreSQL-containers gemarkeerd.

    Er zijn twee nieuwe containers in het dashboard waarop de PostgreSQL-databaseserver en het pgAdmin-hulpprogramma worden gehost. Er is ook een PostgreSQL-databaseresource die als host fungeert voor de CatalogDB-database.

  2. Gebruik pgAdmin om verbinding te maken met de PostgreSQL-database en de gegevens te verkennen. Selecteer het postgres pgadmin-eindpunt .

    Een schermopname van de pgAdmin-interface, waarin de navigatie naar de catalogustabel wordt gemarkeerd.

  3. Vouw Aspire-exemplaren>postgres>Databases>CatalogDB-schemacatalogustabellen>>> uit. Klik vervolgens met de rechtermuisknop op de tabel Catalogus en selecteer Gegevens>eerste 100 rijen weergeven/bewerken.

  4. U kunt de gegevens zien die door de AppHost zijn geladen.

    Een schermopname van de pgAdmin-interface met de geretourneerde rijen uit de tabel Catalogus.

  5. Selecteer het dashboardtabblad eShop-resources in uw browser en selecteer vervolgens het eindpunt van de web-app .

  6. De app wordt geopend en werkt zoals voorheen.

  7. Als u de foutopsporing wilt stoppen, drukt u op Shift+F5 of selecteert u Foutopsporing >stoppen.

Het .NET Aspire MongoDB-onderdeel toevoegen aan de app

De huidige app maakt gebruik van Redis als een in-memory gegevensarchief voor het winkelwagentje van een klant. Het team wil een robuuster en duurzaam gegevensarchief voor het mandje gebruiken. Vervang de Redis-cache door een MongoDB-database.

De Basket.API wijzigen om MongoDB te gebruiken

  1. Klik in Solution Explorer met de rechtermuisknop op het basket.API-project, selecteer Toevoegen en selecteer vervolgens het pakket Add.NET> Aspire.
  2. Voer In het zoekvak MongoDB aan het einde in en druk op Enter.
  3. Selecteer de Aspire.MongoDB.Driver en selecteer vervolgens de nieuwste versie 8.0.0.
  4. Selecteer Installeren.
  5. Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
  6. Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren. @

Een MongoDB-winkel voor manden maken

De basket microservice gebruikt HostingExtensions voor het beheren van het Redis-gegevensarchief. Vervang het Redis-gegevensarchief door een MongoDB-gegevensarchief.

  1. Vouw in Solution Explorer het Basket.API-project uit, vervolgens de opslagmap en selecteer vervolgens het RedisBasketStore.cs-bestand .

    Er zijn twee asynchrone methoden GetBasketAsync en UpdateBasketAsync, die gebruikmaken van de Redis-cache. Hiermee kunt u MongoDB-versies van deze methoden maken.

  2. Klik in Solution Explorer met de rechtermuisknop op de opslagmap en selecteer Klasse toevoegen>.

  3. Geef in het dialoogvenster Nieuw item toevoegen de naam van het bestand MongoBasketStore.cs en selecteer vervolgens Toevoegen.

  4. Vervang de code in het MongoBasketStore.cs bestand door de volgende code:

    using eShop.Basket.API.Models;
    using MongoDB.Driver;
    using MongoDB.Driver.Linq;
    
    namespace eShop.Basket.API.Storage;
    
    public class MongoBasketStore
    {
      private readonly IMongoCollection<CustomerBasket> _basketCollection;
    
      public MongoBasketStore(IMongoClient mongoClient)
      {
        // The database name needs to match the created database in the AppHost
        _basketCollection = mongoClient.GetDatabase("BasketDB").GetCollection<CustomerBasket>("basketitems");
      }
    
      public async Task<CustomerBasket?> GetBasketAsync(string customerId)
      {
        var filter = Builders<CustomerBasket>.Filter.Eq(r => r.BuyerId, customerId);
    
        return await _basketCollection.Find(filter).FirstOrDefaultAsync();
      }
    
      public async Task<CustomerBasket?> UpdateBasketAsync(CustomerBasket basket)
      {
        var filter = Builders<CustomerBasket>.Filter.Eq(r => r.BuyerId, basket.BuyerId);
    
        var result = await _basketCollection.ReplaceOneAsync(filter, basket, new ReplaceOptions { IsUpsert = true });
    
        return result.IsModifiedCountAvailable ? basket : null;
      }
    }
    

    Met de vorige code wordt een MongoBasketStore klasse gemaakt die met het CustomerBasket model werkt. De verzameling verwerkt de CRUD-bewerkingen voor de klanten winkelmandjes in een MongoDB-database.

  5. Vouw in Solution Explorer de Basket.API-extensies> uit en selecteer vervolgens het bestand HostingExtensions.cs.

  6. Vervang de Redis-code:

    builder.AddRedis("BasketStore");
    
    builder.Services.AddSingleton<RedisBasketStore>();
    

    Met de MongoDB-code:

    builder.AddMongoDBClient("BasketDB");
    
    builder.Services.AddSingleton<MongoBasketStore>();
    
  7. Vouw in Solution Explorer de map Grpc uit en open het BasketService.cs-bestand .

  8. Wijzig de klasse om een , vervang het MongoBasketStorevolgende te accepteren:

    public class BasketService(RedisBasketStore basketStore) : Basket.BasketBase
    

    Door:

    public class BasketService(MongoBasketStore basketStore) : Basket.BasketBase
    

Een MongoDB-database toevoegen aan de AppHost

  1. Klik in Solution Explorer met de rechtermuisknop op het project eShop.AppHost en selecteer Add.NET> Aspire package.

  2. Voer In het zoekvak MongoDB aan het einde in en druk op Enter.

  3. Selecteer het Pakket Aspire.Hosting.MongoDB en selecteer vervolgens de nieuwste versie 8.0.0 .

  4. Selecteer Installeren.

  5. Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.

  6. Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren. @

  7. Vouw in Solution Explorer het project eShop.AppHost uit en open het Program.cs bestand.

  8. Voeg in de sectie Databases een MongoDB-onderdeel toe:

    var mongo = builder.AddMongoDB("mongo")
      .WithMongoExpress()
      .AddDatabase("BasketDB");
    

    Met de vorige code wordt een MongoDB-databasecontainer gemaakt en wordt een database met de naam BasketDB toegevoegd. De code maakt ook een container voor het Mongo Express-hulpprogramma waarmee u de MongoDB-database kunt beheren.

  9. Verwijder de Redis-container:

    var basketStore = builder.AddRedis("BasketStore").WithRedisCommander();
    

    De code moet er nu als volgt uitzien:

    // Databases
    
    var postgres = builder.AddPostgres("postgres")
        .WithEnvironment("POSTGRES_DB", "CatalogDB")
        .WithBindMount("../Catalog.API/Seed", "/docker-entrypoint-initdb.d")
        .WithPgAdmin();
    var catalogDB = postgres.AddDatabase("CatalogDB");
    
    var mongo = builder.AddMongoDB("mongo")
        .WithMongoExpress()
        .AddDatabase("BasketDB");
    
  10. Het Basket.API-project heeft een verwijzing naar de nieuwe MongoDB-database nodig. Verwijder de Redis-verwijzing:

    var basketApi = builder.AddProject<Projects.Basket_API>("basket-api")
            .WithReference(mongo)
            .WithReference(idp);
    

Het Basket.API-project is nu klaar om de MongoDB-database te gebruiken. We gaan de app testen om te zien of deze werkt.

De app testen

  1. Compileer en start de app, druk op F5 of selecteer Foutopsporing >starten.

    Een schermopname van het .NET Aspire-dashboard, met de MongoDB-containers gemarkeerd.

    In het dashboard ziet u de nieuwe MongoDB-containers, een voor de databaseserver de andere voor Mongo Express. Er is ook een nieuwe MongoDBDatabase-resource die als host fungeert voor de BasketDB-database .

  2. Selecteer het eindpunt van de web-app .

  3. Als u zich wilt aanmelden met de referenties van de testgebruiker, selecteert u het gebruikerspictogram in de rechterbovenhoek. Het e-mailbericht is test@example.com en het wachtwoord is P@$$w 0rd1.

  4. Selecteer de Adventurer GPS Watch op de startpagina.

  5. Selecteer Toevoegen aan winkeltas. Er wordt een uitzondering weergegeven:

    Een schermopname van de RpcException.

Fouten opsporen in de app

De app genereert een uitzondering wanneer u probeert een item toe te voegen aan het winkelwagentje. U kunt het dashboard gebruiken om het probleem op te lossen.

  1. Selecteer het dashboardtabblad eShop-resources in uw browser.

    Een schermopname van het dashboard, fouten in de Basket.API en webapp zijn gemarkeerd.

    Het dashboard bevat fouten in de basket-API en web-app. Bekijk de logboeken voor de basket-API.

  2. Voor de basket-API-resource selecteert u Weergave in de kolom Logboeken.

    Een schermopname van de logboeken voor de basket-API-service.

    Er is een uitzondering:

    System.FormatException: Element '_id' does not match any field or property of class eShop.Basket.API.Models.CustomerBasket.
    
  3. Selecteer het menu-item Resources en selecteer vervolgens het mongo-mongoexpress-eindpunt .

  4. Selecteer Weergave in de sectie Databases naast BasketDB.

  5. Selecteer Weergave in Verzamelingen naast basketitems.

    Een schermopname van Mongo Express met de gegevens die zijn opgeslagen in de verzameling basketitems.

    Documenten die zijn opgeslagen in een MongoDB, hebben een _id veld. Elk document dat is opgeslagen in een MongoDB-verzameling, moet een uniek _id veld hebben.

  6. Als u de foutopsporing wilt stoppen, drukt u op Shift+F5 of selecteert u Foutopsporing >stoppen.

Controleer de code en los het probleem op

Laten we de CustomerBasket bekijken en kijken of we het probleem kunnen vinden.

  1. Vouw in Solution Explorer de map Basket.API-modellen> uit en open het CustomerBasket.cs bestand.

    public class CustomerBasket
    {
        public required string BuyerId { get; set; }
    
        public List<BasketItem> Items { get; set; } = [];
    }
    

    Het CustomerBasket-model heeft geen veld of eigenschap die overeenkomt met het _id veld. Entity Framework probeert het _id veld toe te wijzen aan het CustomerBasket-model en er kan geen overeenkomst worden gevonden.

  2. Werk het CustomerBasket model bij om een _id veld op te nemen:

    public class CustomerBasket
    {
        /// <summary>
        /// MongoDB document identifier
        /// </summary>
        public string _id { get; set; } = "";
    
        public required string BuyerId { get; set; }
    
        public List<BasketItem> Items { get; set; } = [];
    }
    

De vaste app testen

  1. Als u de app wilt compileren en starten, drukt u op F5 of selecteert u Foutopsporing >starten.

  2. Klik voor de web-app in de kolom Eindpunten met de rechtermuisknop op de URL en selecteer vervolgens De koppeling openen in het InPrivate-venster.

    Als u een InPrivate-venster gebruikt, zorgt u ervoor dat de browser de vorige sessiecooky niet gebruikt voor verificatie.

  3. Als u zich wilt aanmelden met de referenties van de testgebruiker, selecteert u het gebruikerspictogram in de rechterbovenhoek. Het e-mailbericht is test@example.com en het wachtwoord is P@$$w 0rd1.

  4. Selecteer de Adventurer GPS Watch op de startpagina.

  5. Selecteer Toevoegen aan winkeltas.

    Een schermopname van het winkelmandje van eShop.

    De functionaliteit van de Northern Mountains-app-app werkt nu.

U hebt de SQLite-database vervangen door een PostgreSQL-database en de Redis-cache door een MongoDB-database. U hebt .NET Aspire gebruikt om de databases te beheren en de gegevens daarin te verkennen en u hebt het dashboard gebruikt om een probleem met de app op te lossen.