Die Zeile builder.AddAzureStorage("storage").RunAsEmulator() im AppHost und die Zeile builder.AddAzureBlobServiceClient("blobs") in Kladde.Web gehören zusammen, auch wenn sie in zwei Projekten stehen. Die erste beschreibt, was es gibt: ein Speicherkonto, lokal als Azurite. Die zweite beschreibt, wie eine App es benutzt: einen BlobServiceClient mit Health Check und Telemetrie. Aspire nennt beides eine Integration, einmal für das Hosting und einmal für den Client.

Diese Lektion nimmt die Integrationen auseinander, die die Kladde seit Modul 3.5 und 3.6 benutzt, zeigt, was sie lokal und was sie beim Veröffentlichen tun, und baut eine eigene für den TED-Stub, damit lokale Läufe und die Tests der nächsten Lektionen nie das echte TED fragen.

Zwei Hälften einer Integration

Hosting-Integration Client-Integration
Paket Aspire.Hosting.… Aspire.… ohne Hosting
steht in Kladde.AppHost der App, die den Dienst benutzt
beschreibt eine Ressource im Modell, lokal als Container oder Emulator, beim Veröffentlichen als Bicep den Client der App: Registrierung, Health Check, Telemetrie, Konfiguration
Beispiel AddAzureStorage, AddAzureServiceBus, AddAzureSqlServer AddAzureBlobServiceClient, AddAzureServiceBusClient, AddSqlServerDbContext

Verbunden sind die beiden Hälften nur über einen Namen. WithReference(blobs) im AppHost setzt in der App die Umgebungsvariable ConnectionStrings__blobs; AddAzureBlobServiceClient("blobs") in der App liest ConnectionStrings:blobs. Heißen beide gleich, passt es. Ein Tippfehler fällt erst beim Start auf, mit einer Ausnahme, die sagt, dass weder eine Verbindungszeichenfolge noch eine Adresse angegeben ist. Die Kladde hält die Namen deshalb seit Lektion 3.5.2 als Konstanten in Kladde.Contracts (Messaging.Connection), die AppHost und Apps beide kennen.

Die beiden Hälften hängen nicht voneinander ab. Eine App kann eine Client-Integration auch ohne Aspire benutzen, mit einer Verbindungszeichenfolge aus appsettings.json, und ein AppHost kann eine Ressource beschreiben, deren App sich den Client selbst baut. Die Kladde nimmt beide Hälften, weil sie zusammen mehr können als jede für sich.