SimpleMediator
Railway Oriented Mediator for .NET 10
SimpleMediator is a lightweight, functional mediator abstraction for .NET applications that embraces Railway Oriented Programming (ROP) principles. Built on top of LanguageExt, it provides explicit request/response contracts, composable pipeline behaviors, and rich observability features for building maintainable CQRS-style applications.
Key Features
- Functional Error Handling: All operations return
Either<MediatorError, TValue>for explicit, type-safe error handling - Zero Exceptions Policy: Operational failures travel through functional rails instead of exceptions
- Pipeline Composition: Ordered behaviors, pre-processors, and post-processors for cross-cutting concerns
- Rich Observability: Built-in OpenTelemetry support with activities, metrics, and structured logging
- CQRS Contracts: Explicit
ICommand<T>,IQuery<T>, andINotificationinterfaces - Assembly Scanning: Automatic discovery and registration of handlers, behaviors, and processors
- Functional Failure Detection: Translate domain envelopes into consistent mediator errors
Getting Started
Installation
dotnet add package SimpleMediator
Basic Configuration
using SimpleMediator;
services.AddSimpleMediator(cfg =>
{
cfg.RegisterServicesFromAssemblyContaining<ApplicationMarker>()
.AddPipelineBehavior(typeof(CommandActivityPipelineBehavior<,>))
.AddPipelineBehavior(typeof(QueryMetricsPipelineBehavior<,>));
});
Send a Command
public sealed record RegisterUser(string Email, string Password) : ICommand<Unit>;
var result = await mediator.Send(new RegisterUser("user@example.com", "Pass@123"), ct);
result.Match(
Left: error => logger.LogWarning("Registration failed: {Code}", error.GetMediatorCode()),
Right: _ => logger.LogInformation("User registered successfully"));
Documentation
- API Reference - Complete API documentation
- Getting Started - Quick start guide
- Introduction - Core concepts and architecture
- Architecture Patterns - Design patterns and best practices
- Architecture Decision Records - Key architectural decisions
Quality Metrics
| Metric | Current | Target | Status |
|---|---|---|---|
| Line Coverage | 92.5% | ≥90% | ✅ Exceeded |
| Branch Coverage | 83.3% | ≥85% | 🟡 Near |
| Mutation Score | 93.74% | ≥95% | 🟡 Near |
| Build Warnings | 0 | 0 | ✅ Perfect |
| XML Documentation | 100% | 100% | ✅ Perfect |
| Tests Passing | 204/204 | 100% | ✅ Perfect |
Architecture Highlights
- Railway Oriented Programming: Explicit success/failure paths through
Either<L, R> - Pipeline Pattern: Composable behaviors for validation, logging, metrics, and more
- Dependency Injection: First-class support for Microsoft.Extensions.DependencyInjection
- OpenTelemetry Ready: Built-in ActivitySource and Metrics support
- Immutable Messages: Commands, queries, and notifications are record types
Resources
Built with ❤️ for the .NET community