ErikLieben.FA.ES.EventStreamManagement 2.0.0-preview.17

This is a prerelease version of ErikLieben.FA.ES.EventStreamManagement.
dotnet add package ErikLieben.FA.ES.EventStreamManagement --version 2.0.0-preview.17
                    
NuGet\Install-Package ErikLieben.FA.ES.EventStreamManagement -Version 2.0.0-preview.17
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ErikLieben.FA.ES.EventStreamManagement" Version="2.0.0-preview.17" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ErikLieben.FA.ES.EventStreamManagement" Version="2.0.0-preview.17" />
                    
Directory.Packages.props
<PackageReference Include="ErikLieben.FA.ES.EventStreamManagement" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ErikLieben.FA.ES.EventStreamManagement --version 2.0.0-preview.17
                    
#r "nuget: ErikLieben.FA.ES.EventStreamManagement, 2.0.0-preview.17"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ErikLieben.FA.ES.EventStreamManagement@2.0.0-preview.17
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ErikLieben.FA.ES.EventStreamManagement&version=2.0.0-preview.17&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=ErikLieben.FA.ES.EventStreamManagement&version=2.0.0-preview.17&prerelease
                    
Install as a Cake Tool

ErikLieben.FA.ES

NuGet Changelog .NET 9.0 | 10.0

Quality Gate Status Maintainability Rating Security Rating Technical Debt Lines of Code Coverage Known Vulnerabilities OpenSSF Scorecard

A lightweight, AOT-friendly Event Sourcing toolkit for .NET. Build aggregates, append and read events, create snapshots, upcast historical data, and integrate with Azure storage and Functions.

A Friendly Note

This is an opinionated library built primarily for my own projects and coding style. You're absolutely free to use it (it's MIT licensed!), but please don't expect free support or feature requests. If it works for you, great! If not, there are many other excellent libraries in the .NET ecosystem. For commercially supported event-sourcing platforms, consider EventStoreDB or AxonIQ's Axon Server/Framework.

That said, I do welcome bug reports and thoughtful contributions. If you're thinking about a feature or change, please open an issue first to discuss it.

Getting Started

The fastest way to explore the library is to run the TaskFlow demo application, a full-stack Aspire app showcasing aggregates, projections, Minimal APIs, and Azure Functions.

Prerequisites

Run the Demo

# Clone the repository
git clone https://github.com/eriklieben/ErikLieben.FA.ES.git
cd ErikLieben.FA.ES

# Run the Aspire demo
dotnet run --project demo/src/TaskFlow.AppHost

This starts:

  • API - ASP.NET Core Minimal API with event-sourced aggregates
  • Functions - Azure Functions with EventStream and Projection bindings
  • Frontend - Angular app (optional, at demo/taskflow-web)
  • Azurite - Azure Storage emulator for blobs/tables/queues
  • CosmosDB Emulator - For CosmosDB-backed event streams (optional)

Open the Aspire dashboard (URL shown in console) to see all services and explore.

Optional: Persist Storage

To keep data across restarts:

dotnet run --project demo/src/TaskFlow.AppHost -- --PersistStorage=true

Key Features

Feature Description
Aggregates Encapsulate state and behavior; rebuild state by folding events
Projections Read models that materialize streams into queryable shapes
CLI Tool Generates Fold mappings, factories, and JSON serializers
AOT-friendly Source-generated serializers, no reflection in hot paths (Cosmos DB limitations)
Storage Providers Azure Blob, Table, and Cosmos DB support
Minimal APIs [EventStream] and [Projection] parameter binding
Azure Functions Input bindings for aggregates and projections
Testing In-memory streams with Given-When-Then assertions

Packages

# Core library
dotnet add package ErikLieben.FA.ES

# CLI tool (local)
dotnet new tool-manifest
dotnet tool install ErikLieben.FA.ES.CLI --local

# Storage providers
dotnet add package ErikLieben.FA.ES.AzureStorage
dotnet add package ErikLieben.FA.ES.CosmosDb

# Integrations
dotnet add package ErikLieben.FA.ES.AspNetCore.MinimalApis
dotnet add package ErikLieben.FA.ES.Azure.Functions.Worker.Extensions

# Testing
dotnet add package ErikLieben.FA.ES.Testing

Requirements: .NET 9.0 or .NET 10.0

Documentation

Topic Description
Configuration Service registration and fluent builder API
Storage Providers Azure Blob, Table, and Cosmos DB setup
Concurrency Optimistic concurrency and constraints
Result Types Explicit error handling with Result<T>
Testing AggregateTestBuilder and Given-When-Then patterns
Minimal APIs [EventStream] and [Projection] bindings
Stream Actions Append, read, and fold operations
Notifications Event notifications and subscriptions
Live Migration Migrating event streams without downtime
Event Stream Management Stream rollover and archiving
Analyzer Rules Code analyzers and diagnostics
v2.0 Migration Breaking changes and upgrade guide
Changelog Version history and release notes

Exception Reference

Structured error codes are documented in docs/exceptions/.

Quick Example

// Define an aggregate
public partial class Customer(IEventStream stream) : Aggregate(stream)
{
    public string? Name { get; private set; }

    public Task Register(string name)
    {
        ArgumentNullException.ThrowIfNull(name);
        return Stream.Session(ctx => Fold(ctx.Append(new CustomerRegistered(name))));
    }

    private void When(CustomerRegistered e) => Name = e.Name;
}

// Define an event
[EventName("Customer.Registered")]
public record CustomerRegistered(string Name);

// Generate supporting code
// dotnet tool run faes

See the demo/src/TaskFlow.Domain folder for complete aggregate and projection examples.

License

MIT License - see the LICENSE file for details.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ErikLieben.FA.ES.EventStreamManagement:

Package Downloads
ErikLieben.FA.ES.AzureStorage

Azure Blob and Table storage provider for ErikLieben.FA.ES event sourcing framework. Includes snapshots, tiering, and projection coordination.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0-preview.17 85 5/19/2026
2.0.0-preview.16 67 5/15/2026
2.0.0-preview.15 55 5/15/2026
2.0.0-preview.14 64 5/12/2026
2.0.0-preview.12 69 4/17/2026
2.0.0-preview.11 77 4/17/2026
2.0.0-preview.10 155 3/1/2026
2.0.0-preview.9 274 2/22/2026
2.0.0-preview.8 85 1/7/2026
2.0.0-preview.7 79 1/7/2026
2.0.0-preview.6 84 1/5/2026
2.0.0-preview.5 81 1/5/2026
2.0.0-preview.4 1,099 1/5/2026
2.0.0-preview.3 78 1/5/2026
2.0.0-preview.2 278 12/30/2025
2.0.0-preview.1 373 12/7/2025