Orleans.FSharp.EventSourcing
4.1.0
dotnet add package Orleans.FSharp.EventSourcing --version 4.1.0
NuGet\Install-Package Orleans.FSharp.EventSourcing -Version 4.1.0
<PackageReference Include="Orleans.FSharp.EventSourcing" Version="4.1.0" />
<PackageVersion Include="Orleans.FSharp.EventSourcing" Version="4.1.0" />
<PackageReference Include="Orleans.FSharp.EventSourcing" />
paket add Orleans.FSharp.EventSourcing --version 4.1.0
#r "nuget: Orleans.FSharp.EventSourcing, 4.1.0"
#:package Orleans.FSharp.EventSourcing@4.1.0
#addin nuget:?package=Orleans.FSharp.EventSourcing&version=4.1.0
#tool nuget:?package=Orleans.FSharp.EventSourcing&version=4.1.0
Orleans.FSharp.EventSourcing
Declarative event sourcing for Orleans grains in F#.
What it does
Provides the eventSourcedGrain {} computation expression for defining event-sourced grains with pure apply and handle functions. Bridges to Orleans JournaledGrain for durable event storage.
Quick example
open Orleans.FSharp.EventSourcing
type State = { Balance: decimal }
type Event = Deposited of decimal | Withdrawn of decimal
type Command = Credit of decimal | Debit of decimal
let bankAccount = eventSourcedGrain {
defaultState { Balance = 0m }
apply (fun state event ->
match event with
| Deposited amount -> { state with Balance = state.Balance + amount }
| Withdrawn amount -> { state with Balance = state.Balance - amount })
handle (fun state cmd ->
match cmd with
| Credit amount -> [ Deposited amount ]
| Debit amount when state.Balance >= amount -> [ Withdrawn amount ]
| Debit _ -> [])
logConsistencyProvider "LogStorage"
}
CE keywords
| Keyword | Required | Description |
|---|---|---|
defaultState |
yes | Initial grain state (before any events) |
apply |
yes | Pure function: state -> event -> state |
handle |
yes | Command handler: state -> command -> event list |
logConsistencyProvider |
no | Orleans provider name, e.g. "LogStorage", "StateStorage", "CustomStorage" |
snapshot |
no | Snapshot strategy: Never, Every n, Condition pred |
customStorage |
no | Custom storage callbacks for CustomStorageBasedLogConsistencyProvider |
Custom storage (ICustomStorageInterface)
Use customStorage to plug in your own event store (e.g. EventStoreDB, Marten in append-only mode, or any database).
Pair it with logConsistencyProvider "CustomStorage".
let myGrain = eventSourcedGrain {
defaultState MyState.empty
apply applyEvent
handle handleCommand
logConsistencyProvider "CustomStorage"
customStorage
(fun () -> task {
// Load current version and state from your store
let! version, state = myStore.ReadAsync(grainId)
return version, state
})
(fun events expectedVersion -> task {
// Append events with optimistic concurrency
return! myStore.AppendAsync(events, expectedVersion)
// return true on success, false on concurrency conflict
})
}
The customStorage operation takes two functions:
- read
unit -> Task<int * 'State>— loads the current (version, state) - write
'Event list -> int -> Task<bool>— appends events; returnstrueon success,falseon version conflict
The generated C# stub automatically implements ICustomStorageInterface<WrappedEventSourcedState, WrappedEventSourcedEvent> and the [LogConsistencyProvider(ProviderName = "CustomStorage")] attribute is emitted on the class.
Key modules
| Module | Description |
|---|---|
EventSourcedGrainBuilder |
The eventSourcedGrain {} CE |
EventSourcedGrainDefinition |
foldEvents and handleCommand helpers for replaying and testing |
EventStore |
applyEvent, replayEvents, processCommand, shouldSnapshot |
Dependencies
Microsoft.Orleans.EventSourcingOrleans.FSharpOrleans.FSharp.Runtime
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- FSharp.Control.TaskSeq (>= 0.6.0)
- FSharp.Core (>= 10.1.201)
- FSharp.SystemTextJson (>= 1.4.36)
- FsToolkit.ErrorHandling (>= 5.2.0)
- IcedTasks (>= 0.11.9)
- Microsoft.Extensions.DependencyInjection (>= 10.0.9)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.9)
- Microsoft.Extensions.Hosting (>= 10.0.9)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.9)
- Microsoft.Orleans.BroadcastChannel (>= 10.1.0)
- Microsoft.Orleans.Core.Abstractions (>= 10.1.0)
- Microsoft.Orleans.EventSourcing (>= 10.1.0)
- Microsoft.Orleans.Persistence.Memory (>= 10.1.0)
- Microsoft.Orleans.Reminders (>= 10.1.0)
- Microsoft.Orleans.Runtime (>= 10.1.0)
- Microsoft.Orleans.Sdk (>= 10.1.0)
- Microsoft.Orleans.Serialization.SystemTextJson (>= 10.1.0)
- Microsoft.Orleans.Server (>= 10.1.0)
- Microsoft.Orleans.Streaming (>= 10.1.0)
- Microsoft.Orleans.Transactions (>= 10.1.0)
- Orleans.FSharp (>= 4.1.0)
- Orleans.FSharp.Runtime (>= 4.1.0)
- Polly (>= 8.7.0)
- Serilog.Extensions.Logging (>= 10.0.0)
- TypeShape (>= 10.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.