Oefening: databaseservices gebruiken om gegevens van een .NET Aspire-project op te slaan
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:
Open een terminal.
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:
Blader in de opdrachtregel naar een map van uw keuze waar u met code kunt werken.
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
Start Visual Studio en selecteer vervolgens Een project of oplossing openen.
Blader naar de map waarin u de eShop hebt gekloond, open de startmap en selecteer het eShop.databases.sln bestand en selecteer vervolgens Openen.
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.
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.
Als u de app wilt starten, drukt u op F5 of selecteert u Foutopsporing >starten.
Als het dialoogvenster Docker Desktop starten wordt weergegeven, selecteert u Ja.
Wanneer het dashboard eShop .NET Aspire wordt weergegeven, selecteert u voor de web-app-resource het beveiligde eindpunt:
De app wordt geopend in een browser. U kunt de app verkennen en zien hoe deze werkt.
De referenties van de testgebruiker zijn test@example.com en P@$$w 0rd1.
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 .
Klik in Solution Explorer met de rechtermuisknop op het catalog.API-project en selecteer add.NET> Aspire-pakket.
Voeg in het zoekvak Npgsql.EntityFramework toe aan het einde en druk op Enter.
Selecteer aan de linkerkant , in de resultaten, Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.
Selecteer aan de rechterkant de vervolgkeuzelijst versie en selecteer vervolgens de meest recente versie van 8.0.0 .
Selecteer Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.
Selecteer in Solution Explorer het Project Catalog.API om de inhoud van het bestand Catalog.API.csproj weer te geven.
Verwijder het
PackageReference
voor Microsoft.EntityFrameworkCore.Sqlite:<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.3" />
De nieuwe PostgreSQL DbContext registreren
Vouw in Solution Explorer het project Catalog.API uit en open het Program.cs-bestand .
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.
Selecteer in Solution Explorer onder Catalog.API appsettings.json.
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/" } }
Klik met de rechtermuisknop op het project Catalog.Data.Manager en selecteer Verwijderen.
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.
Klik in Solution Explorer met de rechtermuisknop op het project eShop.AppHost en selecteer Add.NET> Aspire package.
Voeg PostgreSQL toe aan het einde in het zoekvak en druk op Enter.
Selecteer Aan de linkerkant , in de resultaten, De optie Aspire.Hosting.PostgreSQL.
Selecteer aan de rechterkant de vervolgkeuzelijst versie en selecteer vervolgens de meest recente versie van 8.0.0 .
Selecteer Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.
Vouw in Solution Explorer het project eShop.AppHost uit en open het Program.cs bestand.
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.
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);
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.
Compileer en start de app, druk op F5 of selecteer Foutopsporing >starten.
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.
Gebruik pgAdmin om verbinding te maken met de PostgreSQL-database en de gegevens te verkennen. Selecteer het postgres pgadmin-eindpunt .
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.
U kunt de gegevens zien die door de AppHost zijn geladen.
Selecteer het dashboardtabblad eShop-resources in uw browser en selecteer vervolgens het eindpunt van de web-app .
De app wordt geopend en werkt zoals voorheen.
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
- Klik in Solution Explorer met de rechtermuisknop op het basket.API-project, selecteer Toevoegen en selecteer vervolgens het pakket Add.NET> Aspire.
- Voer In het zoekvak MongoDB aan het einde in en druk op Enter.
- Selecteer de Aspire.MongoDB.Driver en selecteer vervolgens de nieuwste versie 8.0.0.
- Selecteer Installeren.
- Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
- 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.
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
enUpdateBasketAsync
, die gebruikmaken van de Redis-cache. Hiermee kunt u MongoDB-versies van deze methoden maken.Klik in Solution Explorer met de rechtermuisknop op de opslagmap en selecteer Klasse toevoegen>.
Geef in het dialoogvenster Nieuw item toevoegen de naam van het bestand MongoBasketStore.cs en selecteer vervolgens Toevoegen.
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 hetCustomerBasket
model werkt. De verzameling verwerkt de CRUD-bewerkingen voor de klanten winkelmandjes in een MongoDB-database.Vouw in Solution Explorer de Basket.API-extensies> uit en selecteer vervolgens het bestand HostingExtensions.cs.
Vervang de Redis-code:
builder.AddRedis("BasketStore"); builder.Services.AddSingleton<RedisBasketStore>();
Met de MongoDB-code:
builder.AddMongoDBClient("BasketDB"); builder.Services.AddSingleton<MongoBasketStore>();
Vouw in Solution Explorer de map Grpc uit en open het BasketService.cs-bestand .
Wijzig de klasse om een , vervang het
MongoBasketStore
volgende te accepteren:public class BasketService(RedisBasketStore basketStore) : Basket.BasketBase
Door:
public class BasketService(MongoBasketStore basketStore) : Basket.BasketBase
Een MongoDB-database toevoegen aan de AppHost
Klik in Solution Explorer met de rechtermuisknop op het project eShop.AppHost en selecteer Add.NET> Aspire package.
Voer In het zoekvak MongoDB aan het einde in en druk op Enter.
Selecteer het Pakket Aspire.Hosting.MongoDB en selecteer vervolgens de nieuwste versie 8.0.0 .
Selecteer Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren. @
Vouw in Solution Explorer het project eShop.AppHost uit en open het Program.cs bestand.
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.
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");
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
Compileer en start de app, druk op F5 of selecteer Foutopsporing >starten.
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 .
Selecteer het eindpunt van de web-app .
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.
Selecteer de Adventurer GPS Watch op de startpagina.
Selecteer Toevoegen aan winkeltas. Er wordt een uitzondering weergegeven:
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.
Selecteer het dashboardtabblad eShop-resources in uw browser.
Het dashboard bevat fouten in de basket-API en web-app. Bekijk de logboeken voor de basket-API.
Voor de basket-API-resource selecteert u Weergave in de kolom Logboeken.
Er is een uitzondering:
System.FormatException: Element '_id' does not match any field or property of class eShop.Basket.API.Models.CustomerBasket.
Selecteer het menu-item Resources en selecteer vervolgens het mongo-mongoexpress-eindpunt .
Selecteer Weergave in de sectie Databases naast BasketDB.
Selecteer Weergave in Verzamelingen naast 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.
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.
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.
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
Als u de app wilt compileren en starten, drukt u op F5 of selecteert u Foutopsporing >starten.
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.
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.
Selecteer de Adventurer GPS Watch op de startpagina.
Selecteer Toevoegen aan winkeltas.
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.