.NET .NET Aspire'de etkinlik oluşturma
.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:
- BeforeStartEvent: Bu olay, uygulama hostu başlatılmadan önce oluşturulur.
- AfterEndpointsAllocatedEvent: Bu olay, uygulama konağı uç noktaları ayırdıktan sonra oluşturulur.
- 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 AfterEndpointsAllocatedEvent
ve 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:
- ConnectionStringAvailableEvent: Bir kaynak için bağlantı dizesi kullanılabilir olduğunda oluşturulur.
- BeforeResourceStartedEvent: Orkestra yöneticisi yeni bir kaynağı başlatmadan önce oluşturulur.
- 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
, ConnectionStringAvailableEvent
ve 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:
- PublishAsync<T>(T, CancellationToken): Belirli bir olay türündeki tüm abonelere bir olay yayımlar.
- PublishAsync<T>(T, EventDispatchBehavior, CancellationToken): Belirli bir dağıtım davranışıyla belirli bir olay türünün tüm abonelerine bir olay yayımlar.
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:
- EventDispatchBehavior.BlockingSequential: Olayları sıralı olarak başlatır ve tümü işlenene kadar bloklar.
- EventDispatchBehavior.BlockingConcurrent: Olayları eşzamanlı olarak tetikler ve tümü işlenene kadar engeller.
- EventDispatchBehavior.NonBlockingSequential: Olayları sıralı olarak başlatır ancak engellemez.
- EventDispatchBehavior.NonBlockingConcurrent: Olayları aynı anda tetikler ancak engellemez.
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.
.NET Aspire