Aspire: use IDistributedApplicationEventingSubscriber

This commit is contained in:
Stef Heyenrath
2026-02-22 10:37:13 +01:00
parent 1c69bb51cc
commit 9e6fd44d03
3 changed files with 38 additions and 60 deletions

View File

@@ -0,0 +1,37 @@
// Copyright © WireMock.Net
using System.Diagnostics;
using Aspire.Hosting;
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Eventing;
using Aspire.Hosting.Lifecycle;
using Microsoft.Extensions.Logging;
namespace WireMock.Net.Aspire;
internal class WireMockLifecycleSubscriber(ILoggerFactory loggerFactory) : IDistributedApplicationEventingSubscriber
{
public Task SubscribeAsync(IDistributedApplicationEventing eventing, DistributedApplicationExecutionContext executionContext, CancellationToken cancellationToken)
{
eventing.Subscribe<ResourceEndpointsAllocatedEvent>(async (@event, ct) =>
{
if (@event.Resource is WireMockServerResource wireMockServerResource)
{
wireMockServerResource.SetLogger(loggerFactory.CreateLogger<WireMockServerResource>());
var endpoint = wireMockServerResource.GetEndpoint();
Debug.Assert(endpoint.IsAllocated);
await wireMockServerResource.WaitForHealthAsync(ct);
await wireMockServerResource.CallAddProtoDefinitionsAsync(ct);
await wireMockServerResource.CallApiMappingBuilderActionAsync(ct);
wireMockServerResource.StartWatchingStaticMappings(ct);
}
});
return Task.CompletedTask;
}
}

View File

@@ -135,7 +135,7 @@ public static class WireMockServerBuilderExtensions
});
// Always add the lifecycle hook to support dynamic mappings and proto definitions
resourceBuilder.ApplicationBuilder.Services.TryAddLifecycleHook<WireMockServerLifecycleHook>();
resourceBuilder.ApplicationBuilder.Services.AddEventingSubscriber<WireMockLifecycleSubscriber>();
return resourceBuilder;
}

View File

@@ -1,59 +0,0 @@
// Copyright © WireMock.Net
using System.Diagnostics;
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Lifecycle;
using Microsoft.Extensions.Logging;
namespace WireMock.Net.Aspire;
internal class WireMockServerLifecycleHook(ILoggerFactory loggerFactory) : IDistributedApplicationLifecycleHook, IAsyncDisposable
{
private readonly CancellationTokenSource _shutdownCts = new();
private CancellationTokenSource? _linkedCts;
private Task? _mappingTask;
public Task AfterEndpointsAllocatedAsync(DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
{
_linkedCts = CancellationTokenSource.CreateLinkedTokenSource(_shutdownCts.Token, cancellationToken);
_mappingTask = Task.Run(async () =>
{
var wireMockServerResources = appModel.Resources
.OfType<WireMockServerResource>()
.ToArray();
foreach (var wireMockServerResource in wireMockServerResources)
{
wireMockServerResource.SetLogger(loggerFactory.CreateLogger<WireMockServerResource>());
var endpoint = wireMockServerResource.GetEndpoint();
Debug.Assert(endpoint.IsAllocated);
await wireMockServerResource.WaitForHealthAsync(_linkedCts.Token);
await wireMockServerResource.CallAddProtoDefinitionsAsync(_linkedCts.Token);
await wireMockServerResource.CallApiMappingBuilderActionAsync(_linkedCts.Token);
wireMockServerResource.StartWatchingStaticMappings(_linkedCts.Token);
}
}, _linkedCts.Token);
return Task.CompletedTask;
}
public async ValueTask DisposeAsync()
{
await _shutdownCts.CancelAsync();
_linkedCts?.Dispose();
_shutdownCts.Dispose();
if (_mappingTask is not null)
{
await _mappingTask;
}
}
}