Table of Contents

Vulthil.Messaging.Abstractions

Use Vulthil.Messaging.Abstractions as the stable contract package.

When to use

  • Sharing consumer/publisher contracts across projects
  • Defining request/reply contracts independently of transport

Pattern

  • Keep only interfaces/contracts in this package
  • Avoid transport-specific types here
  • Version contracts carefully for compatibility

Usage

Defining a consumer

public sealed class OrderCreatedConsumer : IConsumer<OrderCreatedEvent>
{
    public Task ConsumeAsync(
        IMessageContext<OrderCreatedEvent> messageContext,
        CancellationToken cancellationToken)
    {
        var order = messageContext.Message;
        // Process the event
        return Task.CompletedTask;
    }
}

Defining a request/reply consumer

public sealed class GetOrderConsumer : IRequestConsumer<GetOrderRequest, OrderDto>
{
    public Task<OrderDto> ConsumeAsync(
        IMessageContext<GetOrderRequest> messageContext,
        CancellationToken cancellationToken)
    {
        // Fetch and return the order
        return Task.FromResult(new OrderDto());
    }
}

Publishing messages

await publisher.PublishAsync(new OrderCreatedEvent(orderId), cancellationToken: ct);

Request/reply

Result<OrderDto> result = await requester.RequestAsync<GetOrderRequest, OrderDto>(
    new GetOrderRequest(orderId), cancellationToken: ct);

Pass an optional Func<IRequestContext, Task> to configure the request. The context exposes the IPublishContext members (routing key, correlation id, headers) plus SetTimeout for overriding the default response timeout per request:

Result<OrderDto> result = await requester.RequestAsync<GetOrderRequest, OrderDto>(
    new GetOrderRequest(orderId),
    ctx => { ctx.SetTimeout(TimeSpan.FromSeconds(5)); return Task.CompletedTask; },
    cancellationToken: ct);

See Messaging — Request/Reply for details.

Publishing from a consumer

IMessageContext exposes PublishAsync with automatic correlation propagation (CorrelationId, ConversationId, InitiatorId flow from the incoming context):

await ctx.PublishAsync(new InventoryReserveRequested(ctx.Message.OrderId));

See Messaging for details.