public class OrderCreatedMessage : IMessage, IMetadataAware
{
public Guid Id { get; set; } = Guid.NewGuid();
public ConcurrentDictionary<string, object> Metadata { get; set; } = new();
public string OrderNumber { get; set; }
public decimal Amount { get; set; }
}
// Usage in handler
public async Task OnNextAsync(MessageEnvelope envelope)
{
if (envelope.Message is IMetadataAware metadataMessage)
{
// Read metadata set by previous handlers
var userId = metadataMessage.Metadata.GetValueOrDefault("UserId");
var requestId = metadataMessage.Metadata.GetValueOrDefault("RequestId");
// Add new metadata for downstream handlers
metadataMessage.Metadata["ProcessedBy"] = "OrderHandler";
metadataMessage.Metadata["ProcessedAt"] = DateTime.UtcNow;
}
}