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 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() };