Polpware.MessagingService.Protocol 11.0.0

Polpware.MessagingService

Three .NET Standard 2.0 libraries, published to the Polpware baget feed, versioned together.

Package Target Purpose
Polpware.MessagingService.Spec netstandard2.0 Broker-agnostic, async interfaces: IBroadcastService<TOut>, IDispatchingService<TOut>, IUnicastService<TOut>, ISubscriptionService<TIn, TInter>, IRPCLike<TCall, TReturn>, the handler verdict HandlingResult, MessagingServiceException.
Polpware.MessagingService.Protocol netstandard2.0 The message protocol: IMessageHead/IMessageBody/IMessageContainer and MessageHead/MessageBody/MessageContainer, whose lowercase property names are the wire keys. No dependencies.
Polpware.MessagingService.RabbitMQImpl netstandard2.0 The RabbitMQ implementation over RabbitMQ.Client 7: owning connection and channel pools (IConnectionPool, IChannelPool), sealed publishers (BroadcastService, DispatchingService, UnicastService), RPC (DispatchingRpcService, UnicastRpcService) and subscriptions (BroadcastSubscription, DispatchingSubscription, UnicastSubscription), each configured by an options object. Every broker call is async.

Install

The packages are on the Polpware feed, https://baget.polpware.com/v3/index.json:

<PackageReference Include="Polpware.MessagingService.RabbitMQImpl" Version="11.0.0" />
<PackageReference Include="Polpware.MessagingService.Protocol" Version="11.0.0" />

Use

// publish (formportal's shape)
var dispatcher = new DispatchingService<MessageContainer>(connectionPool, channelPool,
    new DispatchingOptions { ConnectionName = "Default", ChannelName = "events", Exchange = "FORM-EVENTS" },
    x => JsonConvert.SerializeObject(x));
await dispatcher.DispatchMessageAsync(message, routingKey);

// subscribe (formevents' shape)
var subscription = new DispatchingSubscription<IMessageBody, IMessageContainer>(connectionPool, channelPool,
    new SubscriptionOptions { Exchange = "FORM-EVENTS", Queue = "formevents", RoutingKey = "SUBMITTED" });
await subscription.SubscribeAsync(
    raw => { var c = JsonConvert.DeserializeObject<MessageContainer>(raw)!; return (c.body!, (IMessageContainer)c); },
    async (body, container, ct) => { await HandleAsync(container); return HandlingResult.Ack(); });

Register ReusableConnectionPool and ReusableChannelPool as singletons; the host's disposal closes the connections. Names (exchange, queue, routing key) are upper-cased with the invariant culture.

A UnicastSubscription sets prefetch 1 on its channel, and the client applies that to every consumer created on the same pooled channel afterwards. Give a unicast subscription its own ChannelName when other subscriptions share the connection.

A BroadcastSubscription with no Queue consumes a generated queue that is durable and not auto-deleted by default, as 10.x did. Set AutoDelete = true or Exclusive = true when the queue should go with the process.

Build, test, pack

This repository follows the chorigen .NET library standard; AGENTS.md carries the short form, including the exact commands:

  • CI=true dotnet build -c Release — as CI builds (warnings are errors; nullable and missing-doc warnings are reported only)
  • dotnet test -c Release — xunit; no broker is needed (the tests substitute the RabbitMQ client interfaces)
  • CI=true dotnet pack -c Release -o out — runs package validation (against the locked API baseline once build/Repo.props names one; unset while a major is open)

Versioning and releases

One version per repository, in build/Repo.props, shared by the three packages. A release is a vX.Y.Z tag on main equal to that version; CI packs, publishes to baget, verifies the listing, and creates the GitHub Release. CHANGELOG.md follows Keep a Changelog; from 10.0.0 on, every major version records its breaking changes with a migration note, backed by docs/api-audit/<version>.md.

Repository

https://github.com/chorigen-io/polpware-messaging-service — main takes changes by pull request only.

No packages depend on Polpware.MessagingService.Protocol.

.NET Standard 2.0

  • No dependencies.

Version Downloads Last updated
11.0.0 34 10/14/2026
10.0.2 2 10/13/2026
10.0.1 2 10/12/2026
10.0.0 25 10/10/2026
8.0.0 74 10/04/2025
7.0.0 16 10/04/2025
3.4.0 15 10/04/2025
3.3.1 14 10/04/2025
3.3.0 16 10/04/2025
3.2.0 17 10/04/2025
3.1.2 15 10/04/2025
3.1.1 15 10/04/2025
3.1.0 17 10/04/2025
3.0.0 16 10/04/2025
2.5.0 20 10/04/2025