Skip to content

Commit 8ebe7f5

Browse files
committed
refactor(events): replace MediatR with custom event handlers
- Removed MediatR dependency and introduced custom interfaces for handling watcher events and closures. - Updated relevant classes to use the new event handler system, promoting better separation of concerns and reducing unnecessary coupling. - Ensured backward compatibility by adapting the configuration in the service registration.
1 parent 892455a commit 8ebe7f5

File tree

11 files changed

+53
-42
lines changed

11 files changed

+53
-42
lines changed

src/ES.Kubernetes.Reflector/ES.Kubernetes.Reflector.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
<PackageReference Include="ES.FX.Ignite.KubernetesClient" />
1616
<PackageReference Include="ES.FX.Microsoft.AspNetCore.JsonPatch" />
1717
<PackageReference Include="ES.FX.Newtonsoft.Json" />
18-
<PackageReference Include="MediatR" />
1918
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" />
2019
</ItemGroup>
2120

src/ES.Kubernetes.Reflector/Mirroring/Core/ResourceMirror.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77
using k8s;
88
using k8s.Autorest;
99
using k8s.Models;
10-
using MediatR;
1110
using Microsoft.AspNetCore.JsonPatch;
1211
using Newtonsoft.Json;
1312

1413
namespace ES.Kubernetes.Reflector.Mirroring.Core;
1514

1615
public abstract class ResourceMirror<TResource>(ILogger logger, IKubernetes kubernetes) :
17-
INotificationHandler<WatcherEvent>,
18-
INotificationHandler<WatcherClosed>
16+
IWatcherEventHandler, IWatcherClosedHandler
1917
where TResource : class, IKubernetesObject<V1ObjectMeta>
2018
{
2119
private readonly ConcurrentDictionary<NamespacedName, HashSet<NamespacedName>> _autoReflectionCache = new();

src/ES.Kubernetes.Reflector/Program.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using ES.Kubernetes.Reflector.Watchers;
1111
using ES.Kubernetes.Reflector.Watchers.Core.Events;
1212
using k8s.Models;
13-
using MediatR;
1413

1514
return await ProgramEntry.CreateBuilder(args).UseSerilog().Build().RunAsync(async _ =>
1615
{
@@ -24,8 +23,6 @@
2423
config.Destructure.ByTransforming<V1ObjectReference>(v => v.NamespacedName()));
2524
builder.IgniteSeqOpenTelemetryExporter();
2625
builder.IgniteKubernetesClient();
27-
builder.Services.AddMediatR(config =>
28-
config.RegisterServicesFromAssembly(typeof(void).Assembly));
2926

3027
builder.Services.Configure<ReflectorOptions>(builder.Configuration.GetSection(nameof(ES.Kubernetes.Reflector)));
3128

@@ -36,11 +33,11 @@
3633
builder.Services.AddSingleton<SecretMirror>();
3734
builder.Services.AddSingleton<ConfigMapMirror>();
3835

39-
builder.Services.AddSingleton<INotificationHandler<WatcherEvent>>(sp => sp.GetRequiredService<SecretMirror>());
40-
builder.Services.AddSingleton<INotificationHandler<WatcherClosed>>(sp => sp.GetRequiredService<SecretMirror>());
36+
builder.Services.AddSingleton<IWatcherEventHandler>(sp => sp.GetRequiredService<SecretMirror>());
37+
builder.Services.AddSingleton<IWatcherClosedHandler>(sp => sp.GetRequiredService<SecretMirror>());
4138

42-
builder.Services.AddSingleton<INotificationHandler<WatcherEvent>>(sp => sp.GetRequiredService<ConfigMapMirror>());
43-
builder.Services.AddSingleton<INotificationHandler<WatcherClosed>>(sp => sp.GetRequiredService<ConfigMapMirror>());
39+
builder.Services.AddSingleton<IWatcherEventHandler>(sp => sp.GetRequiredService<ConfigMapMirror>());
40+
builder.Services.AddSingleton<IWatcherClosedHandler>(sp => sp.GetRequiredService<ConfigMapMirror>());
4441

4542
var app = builder.Build();
4643
app.Ignite();

src/ES.Kubernetes.Reflector/Watchers/ConfigMapWatcher.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
using ES.Kubernetes.Reflector.Configuration;
22
using ES.Kubernetes.Reflector.Watchers.Core;
3+
using ES.Kubernetes.Reflector.Watchers.Core.Events;
34
using k8s;
45
using k8s.Autorest;
56
using k8s.Models;
6-
using MediatR;
77
using Microsoft.Extensions.Options;
88

99
namespace ES.Kubernetes.Reflector.Watchers;
1010

1111
public class ConfigMapWatcher(
1212
ILogger<ConfigMapWatcher> logger,
13-
IMediator mediator,
1413
IKubernetes kubernetes,
15-
IOptionsMonitor<ReflectorOptions> options)
16-
: WatcherBackgroundService<V1ConfigMap, V1ConfigMapList>(logger, mediator, options)
14+
IOptionsMonitor<ReflectorOptions> options,
15+
IEnumerable<IWatcherEventHandler> watcherEventHandlers,
16+
IEnumerable<IWatcherClosedHandler> watcherClosedHandlers)
17+
: WatcherBackgroundService<V1ConfigMap, V1ConfigMapList>(
18+
logger, options, watcherEventHandlers, watcherClosedHandlers)
1719
{
1820
protected override Task<HttpOperationResponse<V1ConfigMapList>> OnGetWatcher(CancellationToken cancellationToken) =>
1921
kubernetes.CoreV1.ListConfigMapForAllNamespacesWithHttpMessagesAsync(watch: true,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ES.Kubernetes.Reflector.Watchers.Core.Events;
2+
3+
public interface IWatcherClosedHandler
4+
{
5+
public Task Handle(WatcherClosed e, CancellationToken cancellationToken);
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ES.Kubernetes.Reflector.Watchers.Core.Events;
2+
3+
public interface IWatcherEventHandler
4+
{
5+
public Task Handle(WatcherEvent e, CancellationToken cancellationToken);
6+
}

src/ES.Kubernetes.Reflector/Watchers/Core/Events/WatcherClosed.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
using MediatR;
1+
namespace ES.Kubernetes.Reflector.Watchers.Core.Events;
22

3-
namespace ES.Kubernetes.Reflector.Watchers.Core.Events;
4-
5-
public class WatcherClosed : INotification
3+
public class WatcherClosed
64
{
75
public required Type ResourceType { get; set; }
86
public bool Faulted { get; set; }

src/ES.Kubernetes.Reflector/Watchers/Core/Events/WatcherEvent.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
using k8s;
22
using k8s.Models;
3-
using MediatR;
43

54
namespace ES.Kubernetes.Reflector.Watchers.Core.Events;
65

7-
public class WatcherEvent : INotification
6+
public class WatcherEvent
87
{
98
public WatchEventType EventType { get; set; }
109
public IKubernetesObject<V1ObjectMeta>? Item { get; set; }

src/ES.Kubernetes.Reflector/Watchers/Core/WatcherBackgroundService.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
using k8s;
66
using k8s.Autorest;
77
using k8s.Models;
8-
using MediatR;
98
using Microsoft.Extensions.Options;
109

1110
namespace ES.Kubernetes.Reflector.Watchers.Core;
1211

1312
public abstract class WatcherBackgroundService<TResource, TResourceList>(
1413
ILogger logger,
15-
IMediator mediator,
16-
IOptionsMonitor<ReflectorOptions> options)
14+
IOptionsMonitor<ReflectorOptions> options,
15+
IEnumerable<IWatcherEventHandler> watcherEventHandlers,
16+
IEnumerable<IWatcherClosedHandler> watcherClosedHandlers)
1717
: BackgroundService
1818
where TResource : IKubernetesObject<V1ObjectMeta>
1919
{
@@ -48,11 +48,12 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
4848
{
4949
var watcherEvent = await eventChannel.Reader.ReadAsync(cancellationToken)
5050
.ConfigureAwait(false);
51-
await mediator.Publish(new WatcherEvent
52-
{
53-
Item = watcherEvent.Item,
54-
EventType = watcherEvent.EventType
55-
}, cancellationToken).ConfigureAwait(false);
51+
foreach (var watcherEventHandler in watcherEventHandlers)
52+
await watcherEventHandler.Handle(new WatcherEvent
53+
{
54+
Item = watcherEvent.Item,
55+
EventType = watcherEvent.EventType
56+
}, cancellationToken);
5657
}
5758
}, cancellationToken);
5859

@@ -95,11 +96,12 @@ await eventChannel.Writer.WriteAsync(new WatcherEvent
9596
logger.LogInformation("Session closed. Duration: {duration}. Faulted: {faulted}.", sessionElapsed,
9697
sessionFaulted);
9798

98-
await mediator.Publish(new WatcherClosed
99-
{
100-
ResourceType = typeof(TResource),
101-
Faulted = sessionFaulted
102-
}, stoppingToken).ConfigureAwait(false);
99+
foreach (var handler in watcherClosedHandlers)
100+
await handler.Handle(new WatcherClosed
101+
{
102+
ResourceType = typeof(TResource),
103+
Faulted = sessionFaulted
104+
}, stoppingToken);
103105
}
104106
}
105107
}

src/ES.Kubernetes.Reflector/Watchers/NamespaceWatcher.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
using ES.Kubernetes.Reflector.Configuration;
22
using ES.Kubernetes.Reflector.Watchers.Core;
3+
using ES.Kubernetes.Reflector.Watchers.Core.Events;
34
using k8s;
45
using k8s.Autorest;
56
using k8s.Models;
6-
using MediatR;
77
using Microsoft.Extensions.Options;
88

99
namespace ES.Kubernetes.Reflector.Watchers;
1010

1111
public class NamespaceWatcher(
1212
ILogger<NamespaceWatcher> logger,
13-
IMediator mediator,
1413
IKubernetes kubernetes,
15-
IOptionsMonitor<ReflectorOptions> options)
16-
: WatcherBackgroundService<V1Namespace, V1NamespaceList>(logger, mediator, options)
14+
IOptionsMonitor<ReflectorOptions> options,
15+
IEnumerable<IWatcherEventHandler> watcherEventHandlers,
16+
IEnumerable<IWatcherClosedHandler> watcherClosedHandlers)
17+
: WatcherBackgroundService<V1Namespace, V1NamespaceList>(
18+
logger, options, watcherEventHandlers, watcherClosedHandlers)
1719
{
1820
protected override Task<HttpOperationResponse<V1NamespaceList>> OnGetWatcher(CancellationToken cancellationToken) =>
1921
kubernetes.CoreV1.ListNamespaceWithHttpMessagesAsync(watch: true, timeoutSeconds: WatcherTimeout,

0 commit comments

Comments
 (0)