Orleans.FSharp.EventSourcing
2.0.0-alpha.1
See the version list below for details.
dotnet add package Orleans.FSharp.EventSourcing --version 2.0.0-alpha.1
NuGet\Install-Package Orleans.FSharp.EventSourcing -Version 2.0.0-alpha.1
<PackageReference Include="Orleans.FSharp.EventSourcing" Version="2.0.0-alpha.1" />
<PackageVersion Include="Orleans.FSharp.EventSourcing" Version="2.0.0-alpha.1" />
<PackageReference Include="Orleans.FSharp.EventSourcing" />
paket add Orleans.FSharp.EventSourcing --version 2.0.0-alpha.1
#r "nuget: Orleans.FSharp.EventSourcing, 2.0.0-alpha.1"
#:package Orleans.FSharp.EventSourcing@2.0.0-alpha.1
#addin nuget:?package=Orleans.FSharp.EventSourcing&version=2.0.0-alpha.1&prerelease
#tool nuget:?package=Orleans.FSharp.EventSourcing&version=2.0.0-alpha.1&prerelease
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.Core (>= 10.1.203)
- Microsoft.Orleans.EventSourcing (>= 10.1.0)
- Orleans.FSharp (>= 2.0.0-alpha.1)
- Orleans.FSharp.Runtime (>= 2.0.0-alpha.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.