Esemény a .NET.NET Aspire
A(z) .NET.NET Aspireesetében az eseménykezelés lehetővé teszi, hogy eseményeket tegyen közzé, illetve iratkozzon fel azokra a alkalmazásgazda különféle életciklusainak során. Az eseménykészítés rugalmasabb, mint az életciklus-események. Mindkettő lehetővé teszi tetszőleges kód futtatását az eseményvisszahívások során, de az eseménykezelés finomabb vezérlést biztosít az eseményidőzítéshez, a közzétételhez, és támogatja az egyéni eseményeket.
A .NET.NET Aspire eseményezési mechanizmusai a 📦Aspirerészét képezik. NuGet-csomag üzemeltetése. Ez a csomag több felületet és osztályt biztosít a Aspire.Hosting.Eventing névtérben, amelyekkel közzéteheti és előfizethet a .NET.NET Aspire alkalmazásgazdaprojekt eseményeire. Az eseménykezelés az alkalmazás gazdagépére és a benne lévő erőforrásokra korlátozódik.
Ebből a cikkből megtudhatja, hogyan használhatja a .NET.NET Aspireeseményfunkcióinak használatát.
Alkalmazásgazda eseménykezelés
Az alábbi események érhetők el az alkalmazás gazdaalkalmazásában, és az alábbi sorrendben történnek.
- BeforeStartEvent: Ezt az eseményt az alkalmazáskiszolgáló elindítása előtt indítja el a rendszer.
- AfterEndpointsAllocatedEvent: Ez az esemény az alkalmazás házigazdája által lefoglalt végpontok után történik.
- AfterResourcesCreatedEvent: Ez az esemény azt követően keletkezik, hogy az alkalmazásgazda létrehozta az erőforrásokat.
Az összes fenti esemény hasonló az alkalmazás gazdagépének életciklusához. Vagyis a IDistributedApplicationLifecycleHook megvalósítása ugyanúgy képes kezelni ezeket az eseményeket. Az eventing API-val azonban tetszőleges kódot futtathat, amikor ezek az események létrejönnek, és egyéni eseményeket is definiálhat—bármilyen eseményt, amely megvalósítja a IDistributedApplicationEvent felületet.
Feliratkozás az alkalmazásgazda eseményekre
A beépített alkalmazásgazda eseményekre való feliratkozáshoz használja az eventing API-t. Miután rendelkezik egy elosztott alkalmazásszerkesztő-példánnyal, lépjen a IDistributedApplicationBuilder.Eventing tulajdonsághoz, és hívja meg a Subscribe<T>(Func<T,CancellationToken,Task>) API-t. Fontolja meg a következő mintaalkalmazás-gazdagép Program.cs fájlt:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(cache)
.WaitFor(cache)
.WithReference(apiService)
.WaitFor(apiService);
builder.Eventing.Subscribe<BeforeStartEvent>(
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("1. BeforeStartEvent");
return Task.CompletedTask;
});
builder.Eventing.Subscribe<AfterEndpointsAllocatedEvent>(
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("2. AfterEndpointsAllocatedEvent");
return Task.CompletedTask;
});
builder.Eventing.Subscribe<AfterResourcesCreatedEvent>(
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("3. AfterResourcesCreatedEvent");
return Task.CompletedTask;
});
builder.Build().Run();
Az előző kód a kezdősablonon alapul, és a hívásokat a Subscribe
API-hoz is hozzá kell adni. A Subscribe<T>
API egy DistributedApplicationEventSubscription példányt ad vissza, amellyel leiratkozhat az eseményről. Az elterjedt gyakorlat, hogy figyelmen kívül hagyják a visszakapott előfizetéseket, mivel általában nincs szükség az eseményekről való leiratkozásra, ugyanis az egész alkalmazás elbontásra kerül, amikor az alkalmazás gazdagépe leáll.
Amikor az alkalmazásgazda fut, mire a .NET.NET Aspire irányítópult megjelenik, a következő naplókimenetnek kellene megjelennie a konzolon:
info: Program[0]
1. BeforeStartEvent
info: Aspire.Hosting.DistributedApplication[0]
Aspire version: 9.0.0
info: Aspire.Hosting.DistributedApplication[0]
Distributed application starting.
info: Aspire.Hosting.DistributedApplication[0]
Application host directory is: ..\AspireApp\AspireApp.AppHost
info: Program[0]
2. AfterEndpointsAllocatedEvent
info: Aspire.Hosting.DistributedApplication[0]
Now listening on: https://localhost:17178
info: Aspire.Hosting.DistributedApplication[0]
Login to the dashboard at https://localhost:17178/login?t=<YOUR_TOKEN>
info: Program[0]
3. AfterResourcesCreatedEvent
info: Aspire.Hosting.DistributedApplication[0]
Distributed application started. Press Ctrl+C to shut down.
A naplókimenet megerősíti, hogy az eseménykezelők végrehajtása az alkalmazás gazdagépének életciklus-eseményeinek sorrendjében történik. Az előfizetési rendelés nem befolyásolja a végrehajtási sorrendet. Először a BeforeStartEvent
aktiválódik, majd AfterEndpointsAllocatedEvent
, végül pedig AfterResourcesCreatedEvent
.
Erőforrás-eseményezés
Az alkalmazásgazda-események mellett az erőforrásesemények feliratkozására is van lehetőség. Az erőforrásesemények egy adott erőforráshoz vannak hozzárendelve. Az erőforrásesemények a IDistributedApplicationResourceEvent felület implementációiként vannak definiálva. A következő erőforrásesemények érhetők el a felsorolt sorrendben:
- ConnectionStringAvailableEvent: Akkor merül fel, amikor egy kapcsolati karakterlánc elérhetővé válik egy erőforrás számára.
- BeforeResourceStartedEvent: A vezénylő egy új erőforrás indítása előtt van felállítva.
- ResourceReadyEvent: Akkor merül fel, amikor egy erőforrás kezdetben kész állapotba vált.
Feliratkozás erőforráseseményekre
Az erőforrásesemények előfizetéséhez használja az eventing API-t. Miután rendelkezik egy elosztott alkalmazásszerkesztő-példánnyal, lépjen a IDistributedApplicationBuilder.Eventing tulajdonsághoz, és hívja meg a Subscribe<T>(IResource, Func<T,CancellationToken,Task>) API-t. Fontolja meg a következő mintaalkalmazás-gazdagép Program.cs fájlt:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
builder.Eventing.Subscribe<ResourceReadyEvent>(
cache.Resource,
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("3. ResourceReadyEvent");
return Task.CompletedTask;
});
builder.Eventing.Subscribe<BeforeResourceStartedEvent>(
cache.Resource,
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("2. BeforeResourceStartedEvent");
return Task.CompletedTask;
});
builder.Eventing.Subscribe<ConnectionStringAvailableEvent>(
cache.Resource,
static (@event, cancellationToken) =>
{
var logger = @event.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("1. ConnectionStringAvailableEvent");
return Task.CompletedTask;
});
var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(cache)
.WaitFor(cache)
.WithReference(apiService)
.WaitFor(apiService);
builder.Build().Run();
Az előző kód feliratkozik a ResourceReadyEvent
, ConnectionStringAvailableEvent
és BeforeResourceStartedEvent
eseményekre az cache
erőforráson. A AddRedis meghívásakor egy IResourceBuilder<T>-et ad vissza, ahol a T
egy RedisResource. Az erőforrás-szerkesztő IResourceBuilder<T>.Resource tulajdonságként teszi elérhetővé az erőforrást. A kérdéses erőforrás ezután a Subscribe
API-nak lesz átadva, hogy feliratkozzon az erőforrás eseményeire.
Az alkalmazásgazda futtatásakor a .NET.NET Aspire irányítópult megjelenítéséhez a következő naplókimenetnek kell megjelennie a konzolon:
info: Aspire.Hosting.DistributedApplication[0]
Aspire version: 9.0.0
info: Aspire.Hosting.DistributedApplication[0]
Distributed application starting.
info: Aspire.Hosting.DistributedApplication[0]
Application host directory is: ..\AspireApp\AspireApp.AppHost
info: Program[0]
1. ConnectionStringAvailableEvent
info: Program[0]
2. BeforeResourceStartedEvent
info: Program[0]
3. ResourceReadyEvent
info: Aspire.Hosting.DistributedApplication[0]
Now listening on: https://localhost:17222
info: Aspire.Hosting.DistributedApplication[0]
Login to the dashboard at https://localhost:17222/login?t=<YOUR_TOKEN>
info: Aspire.Hosting.DistributedApplication[0]
Distributed application started. Press Ctrl+C to shut down.
Jegyzet
Egyes események blokkolva vannak. Például amikor a BeforeResourceStartEvent
közzé van téve, a forrás elindítása le lesz tiltva addig, amíg az esemény adott erőforráshoz kapcsolódó összes előfizetése teljesen le nem fut. Az, hogy egy esemény blokkolva van-e, attól függ, hogy hogyan történik a közzététel (lásd a következő szakaszt).
Események közzététele
A beépített eseményekre való feliratkozáskor nem kell saját maga közzétennie az eseményt, mivel az alkalmazásgazda vezénylője kezeli a beépített események közzétételét az Ön nevében. Az egyéni eseményeket azonban közzéteheti az eventing API-val. Az esemény közzétételéhez először meg kell határoznia egy eseményt a IDistributedApplicationEvent vagy IDistributedApplicationResourceEvent felület implementációjaként. Meg kell határoznia, hogy melyik felületet kell implementálnia annak alapján, hogy az esemény globális alkalmazásgazda esemény vagy erőforrás-specifikus esemény-e.
Ezután az alábbi API-k meghívásával előfizethet és közzéteheti az eseményt:
- PublishAsync<T>(T, CancellationToken): Egy eseményt tesz közzé az adott eseménytípus összes előfizetettje számára.
- PublishAsync<T>(T, EventDispatchBehavior, CancellationToken): Egy eseményt tesz közzé az adott eseménytípus összes feliratkozójának egy megadott küldési viselkedéssel.
Adjon meg egy EventDispatchBehavior
Az események elküldésekor szabályozhatja, hogy az események hogyan legyenek elküldve az előfizetőknek. Az eseményküldési viselkedés a EventDispatchBehavior
enumerálással van megadva. A következő viselkedések érhetők el:
- EventDispatchBehavior.BlockingSequential: Egymás után aktiválja az eseményeket, és mindaddig blokkolja az eseményeket, amíg az összes feldolgozásra nem kerül.
- EventDispatchBehavior.BlockingConcurrent: Egyidejűleg aktiválja az eseményeket, és mindaddig blokkolja az eseményeket, amíg azokat fel nem dolgozzák.
- EventDispatchBehavior.NonBlockingSequential: Egymás után aktiválja az eseményeket, de nem tiltja le.
- EventDispatchBehavior.NonBlockingConcurrent: Egyidejűleg indítja el az eseményeket, de nem akadályozza őket.
Az alapértelmezett viselkedés EventDispatchBehavior.BlockingSequential
. A viselkedés felülbírálásához egy közzétételi API(például PublishAsync) meghívásakor adja meg a kívánt viselkedést argumentumként.