ND.FW.QueueManagement
1.0.0
dotnet add package ND.FW.QueueManagement --version 1.0.0
NuGet\Install-Package ND.FW.QueueManagement -Version 1.0.0
<PackageReference Include="ND.FW.QueueManagement" Version="1.0.0" />
<PackageVersion Include="ND.FW.QueueManagement" Version="1.0.0" />
<PackageReference Include="ND.FW.QueueManagement" />
paket add ND.FW.QueueManagement --version 1.0.0
#r "nuget: ND.FW.QueueManagement, 1.0.0"
#:package ND.FW.QueueManagement@1.0.0
#addin nuget:?package=ND.FW.QueueManagement&version=1.0.0
#tool nuget:?package=ND.FW.QueueManagement&version=1.0.0
ND.FW.QueueManagement
Provider-agnostic message publish/consume abstraction for Novacis Digital services.
Business code depends only on IQueuePublisher, IQueueConsumer, and
IQueueProviderFactory — never on ActiveMQ or Azure Service Bus types directly.
The active provider is selected via configuration (Messaging:Provider), so
switching providers is a config change, not a code change.
Supported providers:
- ActiveMQ (via MassTransit) — primary
- Azure Service Bus — supported, credential-resolved through
ND.FW.ClientManagement
Install
dotnet add package ND.FW.QueueManagement
Depends on
ND.FW.ClientManagement(for Service Bus credential resolution). NuGet restores it transitively.
Register
using QueueManagement.Extensions;
// Registers both provider implementations + IQueueProviderFactory,
// bound from configuration sections "ActiveMQ" and "ServiceBus"
services.AddQueueConsumer(configuration);
// Starts the background worker that drives message consumption
services.AddQueueConsumerWorker();
Or register a single provider explicitly if you don't need the factory:
services.AddActiveMQ(options =>
{
options.BrokerUri = "activemq:tcp://broker:61616";
options.QueueName = "intake-events";
});
// — or —
services.AddAzureServiceBus(options =>
{
options.FullyQualifiedNamespace = "mynamespace.servicebus.windows.net";
options.QueueName = "intake-events";
options.CredentialType = CredentialType.ManagedIdentity; // from ND.FW.ClientManagement
});
Publishing
public class MyPublisher
{
private readonly IQueuePublisher _publisher;
public MyPublisher(IQueueProviderFactory factory)
{
_publisher = factory.GetPublisher("servicebus"); // or "activemq"
}
public Task PublishAsync(MyEvent evt) =>
_publisher.PublishAsync(evt, "intake-events");
}
PublishAsync<T> serialises T to JSON and injects trace correlation headers.
PublishBatchAsync<T> is available for high-throughput scenarios.
Consuming
public class MyMessageHandler : IMessageHandler
{
public async Task HandleAsync(QueueMessageContext context, CancellationToken ct)
{
// deserialize context.Body, do work...
await context.CompleteAsync(); // ack — removes from queue
// await context.AbandonAsync(); // negative-ack — redeliver
// await context.DeadLetterAsync("reason"); // move to DLQ
}
}
QueueConsumerWorker (registered via AddQueueConsumerWorker()) resolves all
IMessageHandler registrations and invokes them in registration order for each
incoming message. Register your handler as scoped:
services.AddScoped<IMessageHandler, MyMessageHandler>();
API
| Interface | Purpose |
|---|---|
IQueuePublisher |
Publish single/batch messages to a named queue |
IQueueConsumer |
Start/stop consuming; exposes QueueMessageContext lifecycle |
IQueueProviderFactory |
Resolve the active IQueuePublisher / IQueueConsumer by provider name ("activemq" / "servicebus") |
IMessageHandler |
Domain-level handler invoked per message by QueueConsumerWorker |
IMessageProcessor |
Orchestrates full message processing (deserialize → handle → ack/abandon/dead-letter) |
QueueMessageContext
public sealed record QueueMessageContext
{
string MessageId;
string Body;
IReadOnlyDictionary<string, object> Properties;
Func<Task> CompleteAsync;
Func<Task> AbandonAsync;
Func<string?, Task> DeadLetterAsync;
}
Configuration
{
"ActiveMQ": {
"BrokerUri": "tcp://broker:61616",
"QueueName": "intake-events",
"Username": "",
"Password": ""
},
"ServiceBus": {
"FullyQualifiedNamespace": "mynamespace.servicebus.windows.net",
"QueueName": "intake-events",
"MaxConcurrentCalls": 5,
"CredentialType": "ManagedIdentity"
}
}
Dependencies
MassTransit/MassTransit.ActiveMQ8.2.3Azure.Messaging.ServiceBus7.18.0ND.FW.ClientManagement(>= 1.0.0) — required for Service Bus credential resolution. Must be published before this package.
Publish order
ND.FW.ClientManagement → ND.FW.QueueManagement
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
-
net8.0
- Azure.Messaging.ServiceBus (>= 7.18.0)
- MassTransit (>= 8.2.3)
- MassTransit.ActiveMQ (>= 8.2.3)
- Microsoft.Extensions.Configuration (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.Logging (>= 8.0.0)
- Microsoft.Extensions.Logging.Console (>= 8.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- ND.FW.ClientManagement (>= 1.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 229 | 7/7/2026 |