PouryaKit.Messaging.Wolverine
0.1.0-preview.2
dotnet add package PouryaKit.Messaging.Wolverine --version 0.1.0-preview.2
NuGet\Install-Package PouryaKit.Messaging.Wolverine -Version 0.1.0-preview.2
<PackageReference Include="PouryaKit.Messaging.Wolverine" Version="0.1.0-preview.2" />
<PackageVersion Include="PouryaKit.Messaging.Wolverine" Version="0.1.0-preview.2" />
<PackageReference Include="PouryaKit.Messaging.Wolverine" />
paket add PouryaKit.Messaging.Wolverine --version 0.1.0-preview.2
#r "nuget: PouryaKit.Messaging.Wolverine, 0.1.0-preview.2"
#:package PouryaKit.Messaging.Wolverine@0.1.0-preview.2
#addin nuget:?package=PouryaKit.Messaging.Wolverine&version=0.1.0-preview.2&prerelease
#tool nuget:?package=PouryaKit.Messaging.Wolverine&version=0.1.0-preview.2&prerelease

PouryaKit.Messaging.Wolverine
Durable deliveries on Wolverine, with the message store in PostgreSQL. A Composition Root declares here what a Module handles, publishes and subscribes to, and which commands it runs later or on a cadence. Every one of these is stored in the Outbox in the commit that causes it and sent only after it, and each delivery runs as an Operation of its own, is retried, and ends as a dead letter you can replay when its attempts run out.
Install
dotnet add package PouryaKit.Messaging.Wolverine --prerelease
When to use it
- You declare Notification Handlers, publications, Snapshots and subscriptions in a Composition Root.
- A command must run later, such as a quote's expiry, or on a cadence, such as a nightly reconciliation.
- You set the retries, or find and replay dead letters.
The Host chooses its store package: PouryaKit.Messaging.Wolverine.EFCore for EF Core Modules and PouryaKit.Messaging.Wolverine.Marten for Stream Modules. PouryaKit.Messaging.Wolverine.RabbitMq adds a broker between Hosts.
Quick start
Declare a Module's messaging in its Composition Root, from the Proving Sample's Catalog and Billing:
module.AddPouryaKitNotificationHandlers();
module.Publish<ProductCreatedV1>("catalog.product-created.v1");
module.Subscribe<ProductCreatedV1, OpenPriceListIntegrationEventHandler>(
"billing.product-created"
);
module.AddPouryaKitDelayedCommand<ExpireQuoteCommand>("billing.expire-quote");
Schedule a delayed command from a handler; the Unit of Work writes it with the quote, in one commit:
internal sealed class OpenQuoteCommandHandler(
IRepository<Quote, QuoteId> quotes,
IDelayedCommands later,
TimeProvider time
) : CommandHandler<OpenQuoteCommand>
{
public override async Task<Result> Handle(
OpenQuoteCommand command,
CancellationToken cancellationToken
)
{
var quote = Quote.Open(new QuoteId(command.QuoteId), time.GetUtcNow() + command.ValidFor);
await quotes.AddAsync(quote, cancellationToken);
later.Schedule(new ExpireQuoteCommand(command.QuoteId), quote.ExpiresOn);
return Result.Success();
}
}
Declare recurring work under a named system Actor, its cadence from the Host's configuration:
module
.AddPouryaKitRecurringCommand(
"inventory.reconcile-stock",
systemActor: "inventory.stock-reconciler",
occurrence => new ReconcileStockCommand(occurrence)
)
.BindConfiguration("Inventory:ReconcileStock");
What you get
- Nothing sent before the commit, and what was committed kept in the message store until it is delivered or set aside.
- A subscription of its own for each handler, retried and set aside on its own.
- A Receipt for each delivery, so its database effect applies once.
- Delayed commands that run as a continuation of the Operation that scheduled them, and recurring commands that run as a named system Actor.
- Dead letters you can find and replay.
The Kit's own deliveries need no generated code, but a Wolverine handler a Host adds does: outside Development, a Host without that code does not start, so generate it before the Release build. See Prepare a release.
Learn more
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- PouryaKit.Core (>= 0.1.0-preview.2)
- PouryaKit.Cqrs (>= 0.1.0-preview.2)
- PouryaKit.Messaging (>= 0.1.0-preview.2)
- WolverineFx (>= 6.52.0)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on PouryaKit.Messaging.Wolverine:
| Package | Downloads |
|---|---|
|
PouryaKit.Messaging.Wolverine.EFCore
Every EF Core Module's Outbox and Receipts on Wolverine: what a Module publishes is written in the commit of its change, in PostgreSQL. |
|
|
PouryaKit.Messaging.Wolverine.RabbitMq
Integration Events and Snapshots between Hosts over RabbitMQ, with the retries, Receipts and dead letters of a delivery inside one Host. |
|
|
PouryaKit.Messaging.Wolverine.Sagas
Sagas on Wolverine: Integration Events start and advance them, their timeouts end them, and each step is claimed once in PostgreSQL. |
|
|
PouryaKit.Messaging.Wolverine.Marten
A Stream's messages sent through Wolverine's Marten outbox, so its events commit with the Notifications and Integration Events they cause. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-preview.2 | 92 | 11/1/2026 |
| 0.1.0-preview.1 | 100 | 10/31/2026 |
| 0.1.0-preview.0.28 | 91 | 10/26/2026 |