From 0782dc39982ee0e03d776b1fea67298ca5c7c1bd Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sun, 22 Feb 2026 17:47:53 +0100 Subject: [PATCH] Aspire: use IDistributedApplicationEventingSubscriber (#1428) --- .../WireMockLifecycleSubscriber.cs | 37 ++++++++++++ .../WireMockServerBuilderExtensions.cs | 2 +- .../WireMockServerLifecycleHook.cs | 59 ------------------- 3 files changed, 38 insertions(+), 60 deletions(-) create mode 100644 src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs delete mode 100644 src/WireMock.Net.Aspire/WireMockServerLifecycleHook.cs diff --git a/src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs b/src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs new file mode 100644 index 00000000..df6f1f48 --- /dev/null +++ b/src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs @@ -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(async (@event, ct) => + { + if (@event.Resource is WireMockServerResource wireMockServerResource) + { + wireMockServerResource.SetLogger(loggerFactory.CreateLogger()); + + 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; + } +} \ No newline at end of file diff --git a/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs b/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs index 70a1527c..d89865a7 100644 --- a/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs +++ b/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs @@ -135,7 +135,7 @@ public static class WireMockServerBuilderExtensions }); // Always add the lifecycle hook to support dynamic mappings and proto definitions - resourceBuilder.ApplicationBuilder.Services.TryAddLifecycleHook(); + resourceBuilder.ApplicationBuilder.Services.AddEventingSubscriber(); return resourceBuilder; } diff --git a/src/WireMock.Net.Aspire/WireMockServerLifecycleHook.cs b/src/WireMock.Net.Aspire/WireMockServerLifecycleHook.cs deleted file mode 100644 index 024724df..00000000 --- a/src/WireMock.Net.Aspire/WireMockServerLifecycleHook.cs +++ /dev/null @@ -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() - .ToArray(); - - foreach (var wireMockServerResource in wireMockServerResources) - { - wireMockServerResource.SetLogger(loggerFactory.CreateLogger()); - - 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; - } - } -} \ No newline at end of file