Aracılığıyla paylaş


.NET .NET Aspire'de etkinlik oluşturma

'de olay oluşturma,çeşitli uygulama konağı yaşam döngüleri sırasında olaylar yayımlamanıza ve olaylara abone olmanıza olanak tanır. Olay, yaşam döngüsü olaylarından daha esnektir. Her ikisi de olay geri çağırma işlevleri sırasında istediğiniz kodu çalıştırmanıza olanak tanır, ancak olay oluşturma, olay zamanlaması ve yayımlama üzerinde daha hassas kontrol sunar ve özel olaylar için destek sağlar.

.NET .NET Aspire'deki etkinlik mekanizmaları, 📦Aspire.Hosting NuGet paketinin bir parçasıdır. Bu paket, .NET.NET Aspire uygulama ana bilgisayar projenizdeki olayları yayımlamak ve bunlara abone olmak için kullandığınız Aspire.Hosting.Eventing ad alanında bir dizi arabirim ve sınıf sağlar. Olay yönetimi, uygulama konağının kendisi ve içindeki kaynaklar ile sınırlıdır.

Bu makalede, .NET.NET Aspire'daki olay özelliklerini kullanmayı öğreneceksiniz.

Uygulama sunucusu olay yönetimi

Aşağıdaki olaylar uygulama ana bilgisayarında kullanılabilir ve aşağıdaki sırayla gerçekleşir:

  1. BeforeStartEvent: Bu olay, uygulama hostu başlatılmadan önce oluşturulur.
  2. AfterEndpointsAllocatedEvent: Bu olay, uygulama konağı uç noktaları ayırdıktan sonra oluşturulur.
  3. AfterResourcesCreatedEvent: Bu olay, uygulama hostu kaynakları oluşturulduktan sonra tetiklenir.

Tüm önceki olaylar, uygulama konağı yaşam döngüleriile benzerdir. Yani, IDistributedApplicationLifecycleHook bir uygulaması bu olayları aynı şekilde işleyebilir. Ancak olay oluşturma API'siyle, bu olaylar tetiklendiğinde rastgele kod çalıştırabilir ve olay özel olayları (IDistributedApplicationEvent arabirimini uygulayan herhangi bir olay) tanımlayabilirsiniz.

App host etkinliklerine abone ol

Yerleşik uygulama konağı olaylarına abone olmak için olay api'sini kullanın. Dağıtılmış bir uygulama oluşturucu örneğine sahip olduktan sonra IDistributedApplicationBuilder.Eventing özelliğine gidin ve Subscribe<T>(Func<T,CancellationToken,Task>) API'sini çağırın. Aşağıdaki örnek uygulama konağı Program.cs dosyasını göz önünde bulundurun:

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();

Yukarıdaki kod, Subscribe API'sine çağrıların eklenmesiyle başlangıç şablonunu temel alır. Subscribe<T> API'si, etkinlik aboneliğini kaldırmak için kullanabileceğiniz bir DistributedApplicationEventSubscription örneği döndürür. Genellikle uygulama konağı kapatıldığında tüm uygulama kapatıldığı için olayların aboneliklerinden çıkmanız gerekmez; bu yüzden döndürülen abonelikleri göz ardı etmek yaygın bir durumdur.

Uygulama konağı çalıştırıldığında, .NET.NET Aspire panosu görüntülendiğinde konsolda aşağıdaki günlük çıkışını görmeniz gerekir:

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.

Günlük çıkışı, olay işleyicilerinin uygulama ana bilgisayarı yaşam döngüsü olaylarının sırasına göre yürütüldüğünü onaylar. Abonelik siparişi yürütme sırasını etkilemez. önce BeforeStartEvent tetiklenir, ardından AfterEndpointsAllocatedEventve son olarak AfterResourcesCreatedEvent.

Kaynak etkinlik yönetimi

Uygulama barındırıcı olaylarına ek olarak kaynak olaylarına da abone olabilirsiniz. Kaynak olayları tek bir kaynağa özgü olarak tetiklenir. Kaynak olayları, IDistributedApplicationResourceEvent arabiriminin uygulamaları olarak tanımlanır. Aşağıdaki kaynak olayları listelenen sırayla kullanılabilir:

  1. ConnectionStringAvailableEvent: Bir kaynak için bağlantı dizesi kullanılabilir olduğunda oluşturulur.
  2. BeforeResourceStartedEvent: Orkestra yöneticisi yeni bir kaynağı başlatmadan önce oluşturulur.
  3. ResourceReadyEvent: Kaynak başlangıçta hazır duruma geçtiğinde oluşturulur.

Kaynak olaylarına abone olma

Kaynak olaylarına abone olmak için olay api'sini kullanın. Dağıtılmış bir uygulama oluşturucu örneğine sahip olduktan sonra IDistributedApplicationBuilder.Eventing özelliğine gidin ve Subscribe<T>(IResource, Func<T,CancellationToken,Task>) API'sini çağırın. Aşağıdaki örnek uygulama konağı Program.cs dosyasını göz önünde bulundurun:

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();

Yukarıdaki kod, cache kaynağındaki ResourceReadyEvent, ConnectionStringAvailableEventve BeforeResourceStartedEvent olaylarına abonedir. AddRedis çağrıldığında, IResourceBuilder<T> döndürür ve burada T bir RedisResource'tür. Kaynak oluşturucu, kaynağı IResourceBuilder<T>.Resource özelliği olarak kullanıma sunar. Daha sonra söz konusu kaynak, kaynaktaki olaylara abone olmak için Subscribe API'sine geçirilir.

Uygulama konağı çalıştırıldığında, .NET.NET Aspire panosu görüntülendiğinde konsolda aşağıdaki günlük çıkışını görmeniz gerekir:

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.

Not

Bazı olaylar engelleniyor. Örneğin, BeforeResourceStartEvent yayımlandığında, belirli bir kaynakta söz konusu olay için tüm aboneliklerin yürütülmesi tamamlanana kadar kaynağın başlatılması engellenir. Bir olayın engellenip engellenmediği, nasıl yayımlandığına bağlıdır (aşağıdaki bölüme bakın).

Olayları yayımlama

Yerleşik olaylardan herhangi birine abone olurken, uygulama barındırma düzenleyicisi yerleşik olayları sizin adınıza yayımlamayı yönettiği için olayı kendiniz yayımlamanız gerekmez. Ancak, olay api'siyle özel olaylar yayımlayabilirsiniz. Bir olayı yayımlamak için önce bir olayı IDistributedApplicationEvent veya IDistributedApplicationResourceEvent arabiriminin bir uygulaması olarak tanımlamanız gerekir. Olayın genel uygulama konak olayı mı yoksa kaynağa özgü bir olay mı olduğuna bağlı olarak hangi arabirimin uygulandığını belirlemeniz gerekir.

Ardından, aşağıdaki API'lerden birini çağırarak olayı abone yapabilir ve yayımlayabilirsiniz:

EventDispatchBehavior sağlayın

Olaylar gönderildiğinde, olayların abonelere nasıl dağıtıldığını kontrol edebilirsiniz. Olay yayınlama davranışı EventDispatchBehavior enum sabitiyle belirtilir. Aşağıdaki davranışlar kullanılabilir:

Varsayılan davranış EventDispatchBehavior.BlockingSequential. Bu davranışı geçersiz kılmak için, PublishAsyncgibi bir yayımlama API'sini çağırırken, bağımsız değişken olarak istenen davranışı sağlayın.