mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-11 03:37:11 +02:00
Aspire: use IDistributedApplicationEventingSubscriber (#1428)
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
|
// Always add the lifecycle hook to support dynamic mappings and proto definitions
|
||||||
resourceBuilder.ApplicationBuilder.Services.TryAddLifecycleHook<WireMockServerLifecycleHook>();
|
resourceBuilder.ApplicationBuilder.Services.AddEventingSubscriber<WireMockLifecycleSubscriber>();
|
||||||
|
|
||||||
return resourceBuilder;
|
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