From c5b867bf6c92155d002f5b7f8144be05f43c113a Mon Sep 17 00:00:00 2001 From: Lewis Renfrew Date: Mon, 18 May 2026 15:34:00 +0100 Subject: [PATCH 1/2] template method pattern to make handling json trivial --- src/JsonMessageHandler.cs | 21 +++++++++++++++++++++ src/JsonMessagePublisher.cs | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/JsonMessageHandler.cs diff --git a/src/JsonMessageHandler.cs b/src/JsonMessageHandler.cs new file mode 100644 index 0000000..ecfc6fc --- /dev/null +++ b/src/JsonMessageHandler.cs @@ -0,0 +1,21 @@ +using System.Text.Json; + +namespace Linn.Common.Messaging.RabbitMQ; + +public abstract class JsonMessageHandler(JsonSerializerOptions? serializerOptions = null) : IMessageHandler +{ + public abstract string RoutingKey { get; } + + public async Task HandleAsync(Message message, CancellationToken cancellationToken) + { + var payload = JsonSerializer.Deserialize(message.Body.Span, serializerOptions) + ?? throw new JsonException($"Failed to deserialize message body to {typeof(T).Name}"); + + await HandleAsync(payload, message.Headers, cancellationToken); + } + + protected abstract Task HandleAsync( + T payload, + IReadOnlyDictionary headers, + CancellationToken cancellationToken); +} diff --git a/src/JsonMessagePublisher.cs b/src/JsonMessagePublisher.cs index abe0204..ae8869d 100644 --- a/src/JsonMessagePublisher.cs +++ b/src/JsonMessagePublisher.cs @@ -5,7 +5,8 @@ namespace Linn.Common.Messaging.RabbitMQ; public class JsonMessagePublisher( RabbitPublisher rabbitPublisher, string routingKey, - IReadOnlyDictionary? headers = null) + IReadOnlyDictionary? headers = null, + JsonSerializerOptions? serializerOptions = null) : IPublisher { public async Task PublishAsync(T obj, CancellationToken cancellationToken = default) @@ -13,7 +14,7 @@ public async Task PublishAsync(T obj, CancellationToken cancellationToken = defa var msg = new Message { RoutingKey = routingKey, - Body = JsonSerializer.SerializeToUtf8Bytes(obj), + Body = JsonSerializer.SerializeToUtf8Bytes(obj, serializerOptions), Headers = headers ?? new Dictionary() }; From e2d2254918d8794711967b603aa4c558a27f03bc Mon Sep 17 00:00:00 2001 From: Lewis Renfrew Date: Mon, 18 May 2026 15:37:16 +0100 Subject: [PATCH 2/2] chlog --- changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.md b/changelog.md index 8187dcb..6715320 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,10 @@ # Changelog + +## [5.1.0] - 2026-05-18 +### *Changes* +- Add JsonMessageHandler abstract base class for type-safe message consumption with automatic JSON deserialization +- Add optional JsonSerializerOptions parameter to JsonMessagePublisher + ## [5.0.0] - 2026-05-12 ### *Changes (Breaking)* - Target .NET 10