Megosztás a következőn keresztül:


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.

  1. BeforeStartEvent: Ezt az eseményt az alkalmazáskiszolgáló elindítása előtt indítja el a rendszer.
  2. AfterEndpointsAllocatedEvent: Ez az esemény az alkalmazás házigazdája által lefoglalt végpontok után történik.
  3. 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:

  1. ConnectionStringAvailableEvent: Akkor merül fel, amikor egy kapcsolati karakterlánc elérhetővé válik egy erőforrás számára.
  2. BeforeResourceStartedEvent: A vezénylő egy új erőforrás indítása előtt van felállítva.
  3. 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:

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:

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.