Testowanie aplikacji cloud-native często przypomina balansowanie na linie. Albo płacisz za dedykowane środowisko „Dev” w chmurze, albo spędzasz godziny na konfigurowaniu skomplikowanych mocków. Dzięki .NET Aspire ten problem znika.
W tym wpisie sprawdzimy, jak wykorzystać Azure Service Bus Emulator wewnątrz .NET Aspire, aby w kilka minut uruchomić w pełni funkcjonalny system kolejek na własnym komputerze.
Dlaczego .NET Aspire?
.NET Aspire to nowoczesny stos technologiczny do budowania skalowalnych i obserwowalnych aplikacji rozproszonych. Jedną z jego największych zalet jest możliwość orkiestracji zasobów (takich jak bazy danych czy brokery wiadomości) bezpośrednio z poziomu kodu C#.
Wymagania wstępne
- .NET 8.0/9.0+ SDK
- Docker Desktop lub Podman (wymagany do uruchomienia kontenera z emulatorem)
- Visual Studio 2022 (17.10+) lub VS Code z C# Dev Kit
Krok 1: Dodanie zasobu Service Bus
W projekcie .AppHost musisz zdefiniować zasób Service Bus. Ponieważ chcemy działać lokalnie, .NET Aspire automatycznie uruchomi Azure Service Bus Emulator w kontenerze.
var builder = DistributedApplication.CreateBuilder(args);
// Dodanie zasobu Azure Service Bus
var messaging = builder.AddAzureServiceBus("messaging")
.RunAsEmulator(); // Tu dzieje się magia!
// Podpięcie usługi do API lub Workera
builder.AddProject<Projects.MyApiService>("apiservice")
.WithReference(messaging);
builder.Build().Run();
Krok 2: Konfiguracja projektu klienckiego
W projekcie, który wysyła lub odbiera wiadomości (np. MyApiService), dodaj pakiet integracyjny Aspire:
dotnet add package Aspire.Azure.Messaging.ServiceBus
Następnie zarejestruj klienta w pliku Program.cs:
builder.AddAzureServiceBusClient("messaging");
Krok 3: Wysyłanie i odbieranie wiadomości
Teraz możesz wstrzyknąć ServiceBusClient w dowolnym miejscu w kodzie, nie martwiąc się o parametry połączenia (connection strings). Aspire zajmie się konfiguracją za Ciebie.
app.MapPost("/wyslij", async (ServiceBusClient client) =>
{
var sender = client.CreateSender("moja-kolejka");
await sender.SendMessageAsync(new ServiceBusMessage("Witaj lokalnie!"));
return Results.Ok("Wiadomość wysłana!");
});
Podsumowanie
Używając metody RunAsEmulator(), zyskujesz:
- Oszczędność kosztów: Brak opłat za chmurę podczas developmentu.
- Wydajność: Brak opóźnień sieciowych w porównaniu do endpointów w chmurze.
- Praca offline: Możesz programować w pociągu, samolocie czy gdziekolwiek bez dostępu do Internetu.