LiteBus
Architecture

Dependency Graph

LiteBus v6 splits packages by concern: runtime, messaging, semantic modules, durable orchestration, storage adapters, dispatch adapters, ingress adapters, and shared transport helpers. Applications reference only the packages they compose.

v6.0 rename tables (UseInProcessDispatch, *.AwsSqs package IDs, EF Core public surface, and others) are documented in Migration Guide v6.

The role table below is the normative dependency summary. Generated Package Inventory records every evaluated shipping project reference and direct package reference; documentation CI rejects stale inventory.

Dependency Roles

Roles describe dependency direction and package purpose. They are not numeric layers. Feature axes remain independent from the role assigned to a package.

RolePackage examplesAllowed project dependenciesAllowed direct package dependencies
Platform contractsRuntime.Abstractions, Transport.AbstractionsPlatform contractsBCL only
Mediation contractsMessaging.Abstractions, command/query/event abstractionsPlatform and mediation contractsBCL only
Durable contractsDurableMessaging.Abstractions, inbox/outbox/saga abstractionsPlatform, mediation, and durable contractsBCL only
Core implementationRuntime, Messaging, semantic mediators, Inbox, Outbox, Saga, TransportContract roles and core implementationsLogging abstractions only where operational logging is required
Technology adapterStorage.PostgreSql, Storage.EntityFrameworkCore, Transport.Amqp, Transport.Kafka, Transport.AwsSqs, Transport.AzureServiceBusContract roles, core implementations, and technology adaptersOne relevant persistence or broker SDK, plus logging abstractions
Feature bridgeInbox.Storage.*, Inbox.Dispatch.*, Inbox.Ingress.*, Outbox.Storage.*, Outbox.Dispatch.*, Saga.InboxIntegration, Saga.Storage.*Contract roles, core implementations, technology adapters, and feature bridgesThe relevant adapter SDK, plus logging abstractions
Host adapterDI, hosting, OpenTelemetry, health checks, ASP.NET CoreAny applicable lower role and other host adaptersThe relevant host framework
Consumer toolingLiteBus.Analyzers, LiteBus.Testing.*Any role needed by that narrowly scoped toolAnalyzer or test-support packages
AggregateLiteBusContract and core implementation rolesBCL only

ArchitectureDependencyPolicyTests parses every project under src/. It fails when a project has no role, a project reference points in a forbidden direction, a storage, dispatch, or ingress adapter crosses concerns, or a direct or transitive package reference is not approved for that role. Technology-family checks walk the complete project-reference closure, so a broker SDK cannot enter an adapter through a shared project. Update the matrix and the test together when introducing a new architectural role or SDK family.

Only the LiteBus aggregate meta-package bundles core mediators and durable messaging. Storage, dispatch, ingress, broker transports, and OpenTelemetry remain opt-in.

Role Map

Platform contracts
  Runtime.Abstractions
    -> Runtime
    -> Messaging.Abstractions -> Messaging
    -> DurableMessaging.Abstractions -> Inbox / Outbox / Saga
  Transport.Abstractions -> Transport

Technology adapters
  Storage.PostgreSql / Storage.EntityFrameworkCore
  Transport.Amqp / Transport.Kafka / Transport.AwsSqs / Transport.AzureServiceBus / Transport.InMemory

Feature bridges
  Inbox.Storage.* / Inbox.Dispatch.* / Inbox.Ingress.*
  Outbox.Storage.* / Outbox.Dispatch.*
  Saga.InboxIntegration / Saga.Storage.*

Host adapters
  Runtime.Extensions.* / *.Extensions.Microsoft.DependencyInjection / *.Extensions.Autofac
  *.Extensions.OpenTelemetry / Extensions.AspNetCore / Extensions.Diagnostics.HealthChecks

LiteBus.Runtime depends only on Runtime.Abstractions. ILiteBusBuilder lives in Runtime.Abstractions and exposes only Modules; feature packages add the normal AddMessaging, AddCommands, AddQueries, AddEvents, AddInbox, and AddOutbox extensions. The underlying IModuleRegistry remains available for advanced composition.

Shared transports are root modules. Dispatch and ingress modules declare IRequires<TTransportModule> and never create an implicit broker module. Storage, dispatch, and ingress modules also declare their parent inbox or outbox requirement where the type system permits it. The module registry validates the complete graph before any module builds.

Microsoft DI and Autofac adapters each register one IMessageDispatchScopeFactory. Core packages depend only on that contract and fail composition when no factory is present. A manual host can opt into RootMessageDispatchScopeFactory explicitly. EF Core storage uses IDbContextFactory<TContext> through adapter-owned operation factories and does not create container scopes inside stores.

v6 Package Table

PackageRoleDepends onExternal
LiteBus.Runtime.AbstractionsDI-neutral modules, ILiteBusBuilder, dispatch-scope contracts, and shared W3C trace context parsingnonenone
LiteBus.RuntimeModule registry, dependency descriptors, and advanced module compositionRuntime.Abstractionsnone
LiteBus.Runtime.Extensions.Microsoft.DependencyInjectionMicrosoft DI adapter; defines AddLiteBus in namespace LiteBus.Extensions.Microsoft.DependencyInjectionRuntime, Runtime.Extensions.Microsoft.HostingMicrosoft.Extensions.DependencyInjection.Abstractions
LiteBus.Runtime.Extensions.AutofacAutofac adapterRuntime, Runtime.Extensions.Autofac.HostingAutofac
LiteBus.Messaging.Extensions.Microsoft.DependencyInjectionMicrosoft DI mediator registrationMessaging, runtime DI adapterMicrosoft DI
LiteBus.Messaging.Extensions.AutofacAutofac mediator registrationMessaging, runtime Autofac adapterAutofac
LiteBus.Commands.Extensions.Microsoft.DependencyInjectionMicrosoft DI command registrationCommands, runtime DI adapterMicrosoft DI
LiteBus.Commands.Extensions.AutofacAutofac command registrationCommands, runtime Autofac adapterAutofac
LiteBus.Queries.Extensions.Microsoft.DependencyInjectionMicrosoft DI query registrationQueries, runtime DI adapterMicrosoft DI
LiteBus.Queries.Extensions.AutofacAutofac query registrationQueries, runtime Autofac adapterAutofac
LiteBus.Events.Extensions.Microsoft.DependencyInjectionMicrosoft DI event registrationEvents, runtime DI adapterMicrosoft DI
LiteBus.Events.Extensions.AutofacAutofac event registrationEvents, runtime Autofac adapterAutofac
LiteBus.Extensions.Microsoft.DependencyInjectionConvenience meta-package for every semantic mediator Microsoft DI extension (no source files; does not define AddLiteBus)Commands, Events, Queries, Messaging mediator *.Extensions.Microsoft.DependencyInjection packagesnone
LiteBus.Extensions.Diagnostics.HealthChecksASP.NET Core IHealthCheck adapter for manifest diagnosticsRuntime.AbstractionsMicrosoft.Extensions.Diagnostics.HealthChecks
LiteBus.Extensions.AspNetCoreManagement HTTP endpoints (/litebus/*)Inbox.Abstractions, Outbox.Abstractions, Runtime.AbstractionsASP.NET Core
LiteBus.Messaging.AbstractionsHandler contracts, mediation, execution contextRuntime.Abstractionsnone
LiteBus.MessagingRegistry, mediators, serializer, contract registryDurableMessaging.Abstractions, Messaging.Abstractions, Runtime.Abstractionslogging abstractions
LiteBus.Commands.AbstractionsCommand contracts and handlersMessaging.Abstractionsnone
LiteBus.CommandsCommand mediator and moduleCommands.Abstractions, Messaging, Runtime.Abstractionsnone
LiteBus.Queries.AbstractionsQuery and stream query contractsMessaging.Abstractionsnone
LiteBus.QueriesQuery mediator and moduleQueries.Abstractions, Messaging, Runtime.Abstractionsnone
LiteBus.Events.AbstractionsEvent contracts and handlersMessaging.Abstractionsnone
LiteBus.EventsEvent mediator and moduleEvents.Abstractions, Messaging, Messaging.Abstractions, Runtime.Abstractionsnone
LiteBus.Inbox.AbstractionsInbox records, contracts, envelopes, store roles, and dispatcher contractDurableMessaging.Abstractions, Messaging.Abstractions, Runtime.Abstractionsnone
LiteBus.DurableMessaging.AbstractionsDurable metadata, retry, leases, processor settings, and processor envelope hooksMessaging.Abstractions, Runtime.Abstractionsnone
LiteBus.InboxInbox writer services, processor, module, and InboxModuleBuilderInbox.Abstractions, Messaging, DurableMessaging.Abstractions, Runtime.Abstractionslogging abstractions
LiteBus.Inbox.Storage.PostgreSqlNpgsql inbox store (all three store roles), optional PostgreSqlInboxSchemaInitializerInbox.Abstractions, Storage.PostgreSqlNpgsql
LiteBus.Inbox.Storage.EntityFrameworkCoreEF Core inbox store using IDbContextFactory<TContext> operation contextsInbox, Inbox.Abstractions, Storage.EntityFrameworkCoreEF Core
LiteBus.Inbox.Storage.InMemoryThread-safe in-memory inbox storeInbox.Abstractionsnone
LiteBus.Inbox.Dispatch.InProcessUseInProcessDispatch via ICommandMediatorInbox.Abstractions, Commands.Abstractions, Messagingnone
LiteBus.Inbox.DispatchShared TransportInboxDispatcher and envelope mappingInbox.Abstractions, Messaging, Transport.Abstractions, Transportnone
LiteBus.Inbox.Dispatch.AmqpUseAmqpDispatch: AMQP transport inbox dispatchInbox.Dispatch, Transport.Amqpnone
LiteBus.Inbox.Dispatch.AzureServiceBusUseAzureServiceBusDispatchInbox.Dispatch, Transport.AzureServiceBusnone
LiteBus.Inbox.Dispatch.AwsSqsUseAwsSqsDispatchInbox.Dispatch, Transport.AwsSqsnone
LiteBus.Inbox.Dispatch.KafkaUseKafkaDispatchInbox.Dispatch, Transport.Kafkanone
LiteBus.Inbox.Dispatch.InMemoryUseInMemoryDispatch: in-memory transport inbox dispatchInbox.Dispatch, Transport.InMemorynone
LiteBus.Inbox.IngressMap transport deliveries to IInbox.AcceptAsyncInbox.Abstractions, Messaging.Abstractions, Runtime.Abstractions, Transport.Abstractions, TransportMicrosoft.Extensions.Logging.Abstractions
LiteBus.Inbox.Ingress.AmqpUseAmqpIngress: AMQP inbox ingressInbox.Abstractions, Inbox.Ingress, Messaging.Abstractions, Runtime.Abstractions, Transport.AmqpMicrosoft.Extensions.Logging.Abstractions
LiteBus.Inbox.Ingress.AzureServiceBusUseAzureServiceBusIngressInbox.Abstractions, Inbox.Ingress, Messaging.Abstractions, Runtime.Abstractions, Transport.AzureServiceBusnone
LiteBus.Inbox.Ingress.AwsSqsUseAwsSqsIngressInbox.Abstractions, Inbox.Ingress, Messaging.Abstractions, Runtime.Abstractions, Transport.AwsSqsnone
LiteBus.Inbox.Ingress.KafkaUseKafkaIngressInbox.Abstractions, Inbox.Ingress, Messaging.Abstractions, Runtime.Abstractions, Transport.Kafkanone
LiteBus.Inbox.Ingress.InMemoryUseInMemoryIngressInbox.Abstractions, Inbox.Ingress, Messaging.Abstractions, Runtime.Abstractions, Transport.InMemorynone
LiteBus.Outbox.AbstractionsOutbox records, contracts, envelopes, store roles, and dispatcher contractDurableMessaging.Abstractions, Messaging.Abstractions, Runtime.Abstractionsnone
LiteBus.OutboxOutbox writer services, processor, module, and OutboxModuleBuilderOutbox.Abstractions, Messaging, DurableMessaging.Abstractions, Runtime.Abstractionslogging abstractions
LiteBus.Saga.AbstractionsSaga instance contracts and store interfacesCommands.Abstractions, Messaging.Abstractionsnone
LiteBus.SagaSagaProcessorHook, explicit in-memory store, SagaModule, and SagaModuleBuilderSaga.Abstractions, DurableMessaging.Abstractions, Messaging.Abstractions, Runtime.Abstractionslogging abstractions
LiteBus.Saga.InboxIntegrationNested EnableSaga(...) bridge on InboxModuleBuilderSaga, Inboxnone
LiteBus.Saga.Storage.PostgreSqlExplicit PostgreSQL saga store and schemaSaga, Saga.Abstractions, Storage.PostgreSql, Messaging.Abstractions, Runtime.AbstractionsNpgsql
LiteBus.Outbox.Storage.PostgreSqlNpgsql outbox store, optional PostgreSqlOutboxSchemaInitializerOutbox.Abstractions, Storage.PostgreSqlNpgsql
LiteBus.Outbox.Storage.EntityFrameworkCoreEF Core outbox store using IDbContextFactory<TContext> operation contextsOutbox, Outbox.Abstractions, Storage.EntityFrameworkCoreEF Core
LiteBus.Outbox.Storage.InMemoryThread-safe in-memory outbox storeOutbox.Abstractionsnone
LiteBus.Outbox.Dispatch.InProcessUseInProcessDispatch via IEventMediatorOutbox.Abstractions, Events.Abstractions, Messagingnone
LiteBus.Outbox.DispatchShared TransportOutboxDispatcher and envelope mappingOutbox.Abstractions, Messaging, Transport.Abstractions, Transportnone
LiteBus.Outbox.Dispatch.AmqpUseAmqpDispatch: AMQP transport outbox dispatchOutbox.Dispatch, Transport.Amqpnone
LiteBus.Outbox.Dispatch.AzureServiceBusUseAzureServiceBusDispatchOutbox.Dispatch, Transport.AzureServiceBusnone
LiteBus.Outbox.Dispatch.AwsSqsUseAwsSqsDispatchOutbox.Dispatch, Transport.AwsSqsnone
LiteBus.Outbox.Dispatch.KafkaUseKafkaDispatchOutbox.Dispatch, Transport.Kafkanone
LiteBus.Outbox.Dispatch.InMemoryUseInMemoryDispatch: in-memory transport outbox dispatchOutbox.Dispatch, Transport.InMemorynone
LiteBus.Transport.AbstractionsITransportPublisher, IMessageConsumer, transport headersnonenone
LiteBus.TransportCircuit breaker metrics, transport tracing, and header value parsingTransport.Abstractions, Runtime.Abstractionsnone
LiteBus.Transport.AmqpRabbitMQ adapterTransport.Abstractions, Transport, Runtime.AbstractionsRabbitMQ.Client
LiteBus.Inbox.Extensions.OpenTelemetryRegister inbox traces and metricsInboxOpenTelemetry
LiteBus.Outbox.Extensions.OpenTelemetryRegister outbox traces and metricsOutboxOpenTelemetry
LiteBus.Transport.Extensions.OpenTelemetryRegister transport tracing and circuit breaker metricsTransportOpenTelemetry
LiteBus.Transport.Amqp.Extensions.OpenTelemetryRegister AMQP circuit breaker metricsTransport.AmqpOpenTelemetry
LiteBus.Storage.PostgreSqlShared PG quoting, schema version, advisory locksnoneNpgsql
LiteBus.Storage.EntityFrameworkCoreShared EF Core options, transactions, and provider helpersDurableMessaging.Abstractions, Messaging.AbstractionsEF Core
LiteBus.AnalyzersRoslyn analyzers for handler and contract rulesRoslyn onlyMicrosoft.CodeAnalysis.CSharp
LiteBus.*.Extensions.Microsoft.DependencyInjectionModule registration for Microsoft DIModule package, Microsoft DI runtime adapterMicrosoft DI
LiteBus.Runtime.Extensions.HostingShared host orchestrator and manual background-service wrapperRuntime.Abstractions, Microsoft hosting abstractionsnone
LiteBus.Runtime.Extensions.Microsoft.HostingMicrosoft DI registration for manifest host adaptersRuntime.Extensions.Hosting, Microsoft DI abstractionsnone
LiteBus.Runtime.Extensions.Autofac.HostingAutofac registration for manifest host adaptersRuntime.Extensions.Hosting, Autofacnone
LiteBus.*.Extensions.AutofacModule registration for AutofacModule package, Autofac runtime adapterAutofac
LiteBusAggregate meta-package (core modules; storage/dispatch remain opt-in)Commands, Queries, Events, Messaging, Inbox, Outbox, abstractionsnone
LiteBus.TestingFramework-neutral ManualTimeProvider and LiteBusTestBasenonenone
LiteBus.Testing.MediationTestCommandMediator, TestQueryMediator, and TestEventMediatorcommand, query, and event abstractionsnone
LiteBus.Testing.TransportTestMessageTransport publisher doubleTransport.Abstractionsnone
LiteBus.Testing.DurableMessagingInbox/outbox stores, processor helpers, and InboxOutboxTestHostinbox/outbox core and in-memory storage, Microsoft DI compositionMicrosoft DI
LiteBus.Testing.HostingGeneric Host lifecycle and manifest helpersinbox core and runtime hosting adapterMicrosoft DI and hosting abstractions
LiteBus.Storage.TestingPublished xUnit store conformance bases for custom adapter authorsInbox.Abstractions, Outbox.AbstractionsAwesomeAssertions, xunit
LiteBus.Transport.TestingPublished xUnit publisher and consumer conformance base for custom adapter authorsTransport.Abstractionsxunit

Dependency Rules

FromMay depend onMust NOT depend on
Contract rolesOther allowed contract rolesCore implementations, SDKs, and host frameworks
Transport.AbstractionsnoneAny LiteBus project reference
Inbox / Outbox coreAbstractions, Messaging, Runtime.AbstractionsCommands, Events, Npgsql, EF, RabbitMQ, any Dispatch/Ingress
*.Storage.*Parent axis core, abstractions, store SDK, shared storage technologyDispatch, ingress, semantic mediators, and unrelated adapter concerns
*.Dispatch.*Abstractions, axis core (Inbox / Outbox for IRequires ordering), Messaging when payload protection or trace helpers are required, Transport.Abstractions for transport dispatchStorage, Ingress, broker SDKs, and unrelated adapter concerns
*.Ingress.*Inbox core and abstractions, shared ingress, and the matching root transport packageStorage, dispatch, unrelated broker SDKs, and unrelated adapter concerns
LiteBus.TransportTransport.AbstractionsInbox, Outbox, broker SDKs
LiteBus.Transport.AmqpTransport.Abstractions, TransportInbox, Outbox abstractions
*.Extensions.OpenTelemetryMatching core package (Inbox, Outbox, or Transport)Storage, dispatch, ingress
LiteBus.AnalyzersRoslynruntime libraries

Shared storage technology packages contain only invariants that are identical across durable axes. LiteBus.Storage.PostgreSql owns schema mechanics, database-clock access, and idempotency resolution; LiteBus.Storage.EntityFrameworkCore owns provider resolution, relational lease execution, and common durable operations. Inbox and outbox adapters retain their own tables, row mappings, lifecycle transitions, and public contracts. Similar-looking transition code remains axis-owned when sharing it would couple independent semantics or require a cross-axis abstraction.

Additional rules:

  • Query packages do not depend on inbox or outbox packages.
  • Core inbox and outbox modules register writers and processors only. They do not register dispatchers.
  • Processor background services validate that exactly one dispatcher is registered.
  • Stable contracts use names and versions, not assembly-qualified CLR names.
  • Closed generic messages are supported when each closed type is registered. Open generic contracts are rejected.

Registration Reference

Naming Schemes (Folder, Namespace, NuGet)

SurfaceExample
Repository folder / projectLiteBus.Inbox.Storage.PostgreSql
C# namespaceLiteBus.Inbox.Storage.PostgreSql
NuGet package IDLiteBus.Inbox.Storage.PostgreSql (set in src/Directory.Build.props; only the LiteBus meta-package keeps the LiteBus ID)
Extension holder classInboxModuleBuilderPostgreSqlExtensions

Use* Extension to Package Map

ExtensionPackage
AddAmqpTransport(...)LiteBus.Transport.Amqp
AddKafkaTransport(...)LiteBus.Transport.Kafka
AddAwsSqsTransport(...)LiteBus.Transport.AwsSqs
AddAzureServiceBusTransport(...)LiteBus.Transport.AzureServiceBus
AddInMemoryTransport()LiteBus.Transport.InMemory
UseInMemoryStorage() (inbox)LiteBus.Inbox.Storage.InMemory
UsePostgreSqlStorage(...) (inbox)LiteBus.Inbox.Storage.PostgreSql
UseEntityFrameworkCoreStorage(...) (inbox)LiteBus.Inbox.Storage.EntityFrameworkCore
UseInProcessDispatch() (inbox)LiteBus.Inbox.Dispatch.InProcess
UseAmqpDispatch(...) (inbox)LiteBus.Inbox.Dispatch.Amqp
UseAzureServiceBusDispatch(...) (inbox)LiteBus.Inbox.Dispatch.AzureServiceBus
UseAwsSqsDispatch(...) (inbox)LiteBus.Inbox.Dispatch.AwsSqs
UseKafkaDispatch(...) (inbox)LiteBus.Inbox.Dispatch.Kafka
UseInMemoryDispatch(...) (inbox)LiteBus.Inbox.Dispatch.InMemory
UseAmqpIngress(...)LiteBus.Inbox.Ingress.Amqp
UseAzureServiceBusIngress(...)LiteBus.Inbox.Ingress.AzureServiceBus
UseAwsSqsIngress(...)LiteBus.Inbox.Ingress.AwsSqs
UseKafkaIngress(...)LiteBus.Inbox.Ingress.Kafka
UseInMemoryIngress(...)LiteBus.Inbox.Ingress.InMemory
EnableSaga(...)LiteBus.Saga.InboxIntegration
UseInMemoryStorage() (outbox)LiteBus.Outbox.Storage.InMemory
UsePostgreSqlStorage(...) (outbox)LiteBus.Outbox.Storage.PostgreSql
UseEntityFrameworkCoreStorage(...) (outbox)LiteBus.Outbox.Storage.EntityFrameworkCore
UseInProcessDispatch() (outbox)LiteBus.Outbox.Dispatch.InProcess
UseAmqpDispatch(...) (outbox)LiteBus.Outbox.Dispatch.Amqp
UseAzureServiceBusDispatch(...) (outbox)LiteBus.Outbox.Dispatch.AzureServiceBus
UseAwsSqsDispatch(...) (outbox)LiteBus.Outbox.Dispatch.AwsSqs
UseKafkaDispatch(...) (outbox)LiteBus.Outbox.Dispatch.Kafka
UseInMemoryDispatch(...) (outbox)LiteBus.Outbox.Dispatch.InMemory

Core Mediators (ILiteBusBuilder)

builder.Services.AddLiteBus(builder =>
{
    builder.AddMessaging(_ => { });
    builder.AddCommands(c => c.RegisterFromAssembly(typeof(Program).Assembly));
    builder.AddQueries(q => q.RegisterFromAssembly(typeof(Program).Assembly));
    builder.AddEvents(e => e.RegisterFromAssembly(typeof(Program).Assembly));
});

Inbox Composition

builder.Services.AddLiteBus(builder =>
{
    builder.AddMessaging(_ => { });
    builder.AddInbox(inbox =>
    {
        inbox.Contracts.Register<ProcessPaymentCommand>("payments.process-payment", 1);
        inbox.UseProcessorOptions(new InboxProcessorOptions { BatchSize = 50 });
        inbox.UsePostgreSqlStorage(pg => pg.UseDataSource(dataSource));
        inbox.UseInProcessDispatch();
        inbox.EnableInboxProcessor();
    });
});

Outbox Composition

builder.Services.AddLiteBus(builder =>
{
    builder.AddMessaging(_ => { });
    builder.AddOutbox(outbox =>
    {
        outbox.Contracts.Register<OrderSubmitted>("orders.order-submitted", 1);
        outbox.UsePostgreSqlStorage(pg => pg.UseDataSource(dataSource));
        outbox.UseInProcessDispatch();
        outbox.EnableOutboxProcessor();
    });
});

Transport Dispatch and Ingress

builder.Services.AddLiteBus(builder =>
{
    builder.AddAmqpTransport(new AmqpConnectionOptions
    {
        Uri = new Uri(configuration.GetConnectionString("Amqp")!)
    });
    builder.AddMessaging(_ => { });

    builder.AddOutbox(outbox =>
    {
        outbox.UseAmqpDispatch(options =>
        {
            options.DefaultDestination = "orders.events";
        });
    });

    builder.AddInbox(inbox =>
    {
        inbox.UseAmqpIngress(ingress =>
        {
            ingress.UseOptions(new AmqpInboxIngressOptions
            {
                QueueName = "commands.inbox"
            });
        });
    });
});

AddAmqpTransport owns the horizontal transport at the root. Dispatch and ingress modules require that root module and share its ITransportPublisher and IMessageConsumer. The same rule applies to Kafka, AWS SQS, Azure Service Bus, and in-memory transport modules.

Test Dependencies

Test-only packages live under tests/Directory.Packages.props.

PackageUsed for
xunit, xunit.runner.visualstudioUnit and integration test execution
AwesomeAssertionsTest assertions
Microsoft.NET.Test.Sdk.NET test host
coverlet.collector, coverlet.msbuildCoverage collection
Testcontainers.PostgreSqlPostgreSQL storage integration tests
Testcontainers.RabbitMqAMQP dispatch and ingress integration tests
Testcontainers.Redpanda, Testcontainers.KafkaKafka ingress, dispatch, and outbox integration tests
Testcontainers.LocalStackAWS SQS transport integration tests
NpgsqlPostgreSQL integration tests

PostgreSQL and AMQP integration tests require Docker. CI skips them gracefully when Docker is unavailable.

Next

See Architecture for Storage / Dispatch / Ingress flow diagrams, or Migration Guide v6 for v5 to v6 renames.

On this page