mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-02-23 01:04:55 +01:00
Aspire: use IDistributedApplicationEventingSubscriber
This commit is contained in:
37
src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs
Normal file
37
src/WireMock.Net.Aspire/WireMockLifecycleSubscriber.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user