Multi-Tenancy with Wolverine
Wolverine has first class support for multi-tenancy by tracking the tenant id as message metadata. When invoking a message inline, you can execute that message for a specific tenant with this syntax:
cs
public static async Task invoking_by_tenant(IMessageBus bus)
{
// Invoke inline
await bus.InvokeForTenantAsync("tenant1", new CreateTodo("Release Wolverine 1.0"));
// Invoke with an expected result (request/response)
var created =
await bus.InvokeForTenantAsync<TodoCreated>("tenant2", new CreateTodo("Update the Documentation"));
}
When using this syntax, any cascaded messages will also be tagged with the same tenant id. This functionality is valid with both messages executed locally and messages that are executed remotely depending on the routing rules for that particular message.
To publish a message for a particular tenant id and ultimately pass the tenant id on to the message handler, use the DeliveryOptions
approach:
cs
public static async Task publish_by_tenant(IMessageBus bus)
{
await bus.PublishAsync(new CreateTodo("Fix that last broken test"),
new DeliveryOptions { TenantId = "tenant3" });
}