Skip to main content

Excalibur

Excalibur is a modern, high-performance .NET framework for building scalable applications. Start with Excalibur.Dispatch for type-safe message dispatching, then add domain modeling, event sourcing, and sagas as your architecture requires. Whether you're building a simple CRUD API or a complex distributed system, Excalibur handles the infrastructure so you can focus on business logic.

What Excalibur.Dispatch Does

Excalibur.Dispatch handles how messages flow through your system:

  • Message Dispatching — Send actions to handlers with full type safety
  • Pipeline Behaviors — Add cross-cutting concerns like validation, logging, and transactions
  • Multi-Transport Support — Route messages to Kafka, RabbitMQ, Azure Service Bus, and more
  • Result Handling — Clean success/failure patterns without exceptions
  • Context Propagation — Automatic correlation ID and metadata tracking

Package Families

Excalibur is one framework with focused package families. Install only what you need:

Package FamilyPurpose
Excalibur.Dispatch.*Messaging, pipeline, handlers, transports
Excalibur.DomainDomain modeling (aggregates, entities, value objects)
Excalibur.EventSourcing.*Event stores, snapshots, persistence
Excalibur.Saga.*Sagas and process managers
Excalibur.Hosting.*ASP.NET Core, serverless hosting templates

See the Package Guide for selection help, migration paths, and code examples.

Excalibur.Dispatch vs MediatR

If you're familiar with MediatR, you'll feel right at home. Here's how concepts map:

MediatRDispatchNotes
IRequestIDispatchActionActions without return value
IRequest<TResponse>IDispatchAction<TResult>Actions with return value
IRequestHandler<T>IActionHandler<T>Handler without return
IRequestHandler<T, R>IActionHandler<T, R>Handler with return
INotificationIDispatchEventEvents/notifications
INotificationHandler<T>IEventHandler<T>Event handlers
IMediatorIDispatcherMessage dispatcher

Key improvements over MediatR (all included in Excalibur.Dispatch):

  • Built-in result types with error handling
  • Automatic context propagation for distributed tracing
  • Multi-transport routing support
  • Performance optimizations for high-throughput scenarios

Quick Start

1. Install the Package

dotnet add package Excalibur.Dispatch
dotnet add package Excalibur.Dispatch.Abstractions

2. Define an Action

using Excalibur.Dispatch.Abstractions;

// Action without return value
public record CreateOrderAction(string CustomerId, List<string> Items) : IDispatchAction;

// Action with return value
public record GetOrderAction(Guid OrderId) : IDispatchAction<Order>;

3. Create a Handler

using Excalibur.Dispatch.Abstractions.Delivery;

public class CreateOrderHandler : IActionHandler<CreateOrderAction>
{
private readonly IOrderRepository _repository;

public CreateOrderHandler(IOrderRepository repository)
{
_repository = repository;
}

public async Task HandleAsync(
CreateOrderAction action,
CancellationToken cancellationToken)
{
var order = new Order
{
Id = Guid.NewGuid(),
CustomerId = action.CustomerId,
Items = action.Items
};

await _repository.SaveAsync(order, cancellationToken);
}
}

4. Register and Dispatch

// Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDispatch(dispatch =>
{
dispatch.AddHandlersFromAssembly(typeof(Program).Assembly);
});

var app = builder.Build();

// In your controller or service
public class OrderController : ControllerBase
{
private readonly IDispatcher _dispatcher;

public OrderController(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}

[HttpPost]
public async Task<IActionResult> CreateOrder(
CreateOrderRequest request,
CancellationToken cancellationToken)
{
var action = new CreateOrderAction(request.CustomerId, request.Items);
var result = await _dispatcher.DispatchAsync(action, cancellationToken);

if (result.IsSuccess)
return Ok();

return BadRequest(result.ErrorMessage);
}
}

Growing with Excalibur

Most applications start with Excalibur.Dispatch for messaging and add packages as needs grow:

  1. MessagingExcalibur.Dispatch routes commands/queries to handlers
  2. Domain modelingExcalibur.Domain adds aggregates, entities, and value objects
  3. PersistenceExcalibur.EventSourcing.* provides event stores and snapshots
  4. WorkflowsExcalibur.Saga.* adds sagas and process managers

Because all packages share the same Excalibur.* namespace, you never rewrite existing code when adding new capabilities.

Package Overview

Core Packages

PackageDescription
Excalibur.DispatchCore dispatcher, pipelines, middleware
Excalibur.Dispatch.AbstractionsPublic interfaces (IDispatchAction, IDispatcher)

Transport Packages

PackageDescription
Excalibur.Dispatch.Transport.KafkaApache Kafka transport
Excalibur.Dispatch.Transport.RabbitMQRabbitMQ transport
Excalibur.Dispatch.Transport.AzureServiceBusAzure Service Bus transport
Excalibur.Dispatch.Transport.AwsSqsAWS SQS transport
Excalibur.Dispatch.Transport.GooglePubSubGoogle Pub/Sub transport

Hosting Packages

PackageDescription
Excalibur.Dispatch.Hosting.AspNetCoreASP.NET Core integration
Excalibur.Dispatch.Hosting.AzureFunctionsAzure Functions hosting
Excalibur.Dispatch.Hosting.AwsLambdaAWS Lambda hosting
Excalibur.Dispatch.Hosting.GoogleCloudFunctionsGoogle Cloud Functions hosting
Excalibur.Dispatch.Hosting.Serverless.AbstractionsServerless abstractions

Serialization Packages

PackageDescription
Excalibur.Dispatch.Serialization.MemoryPackHigh-performance binary serialization (default)
Excalibur.Dispatch.Serialization.MessagePackMessagePack serialization
Excalibur.Dispatch.Serialization.ProtobufProtocol Buffers serialization

Security & Compliance Packages

PackageDescription
Excalibur.Dispatch.SecurityCore security infrastructure
Excalibur.Dispatch.AuditLoggingComprehensive audit logging
Excalibur.Dispatch.AuditLogging.DatadogDatadog audit export
Excalibur.Dispatch.AuditLogging.SentinelAzure Sentinel integration
Excalibur.Dispatch.AuditLogging.SplunkSplunk audit export
Excalibur.Dispatch.AuditLogging.SqlServerSQL Server audit store
Excalibur.Dispatch.ComplianceRegulatory compliance framework
Excalibur.Dispatch.Compliance.AbstractionsCompliance abstractions
Excalibur.Dispatch.Compliance.AwsAWS compliance integration
Excalibur.Dispatch.Compliance.AzureAzure compliance integration
Excalibur.Dispatch.Compliance.VaultHashiCorp Vault integration

Operations Packages

PackageDescription
Excalibur.Dispatch.ObservabilityOpenTelemetry integration
Excalibur.Dispatch.Resilience.PollyPolly integration for resilience
Excalibur.Dispatch.CachingCaching infrastructure
Excalibur.Dispatch.Validation.FluentValidationFluentValidation integration

Patterns Packages

PackageDescription
Excalibur.Dispatch.PatternsMessaging patterns (Outbox, ClaimCheck, etc.)
Excalibur.Dispatch.Patterns.AzureAzure-specific patterns
Excalibur.Dispatch.Patterns.ClaimCheck.InMemoryIn-memory claim check store
Excalibur.Dispatch.Patterns.Hosting.JsonJSON hosting patterns

Tooling Packages

PackageDescription
Excalibur.Dispatch.AnalyzersRoslyn analyzers
Excalibur.Dispatch.SourceGeneratorsSource generators
Excalibur.Dispatch.LeaderElection.AbstractionsLeader election abstractions

Next Steps

See Also