MailBiz.Orleans.EventSourcing
9.3.0
dotnet add package MailBiz.Orleans.EventSourcing --version 9.3.0
NuGet\Install-Package MailBiz.Orleans.EventSourcing -Version 9.3.0
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="MailBiz.Orleans.EventSourcing" Version="9.3.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MailBiz.Orleans.EventSourcing" Version="9.3.0" />
<PackageReference Include="MailBiz.Orleans.EventSourcing" />
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 MailBiz.Orleans.EventSourcing --version 9.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: MailBiz.Orleans.EventSourcing, 9.3.0"
#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 MailBiz.Orleans.EventSourcing@9.3.0
#: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=MailBiz.Orleans.EventSourcing&version=9.3.0
#tool nuget:?package=MailBiz.Orleans.EventSourcing&version=9.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Microsoft Orleans Event Sourcing
Introduction
Microsoft Orleans Event Sourcing provides support for implementing event-sourced grains. Event sourcing is a pattern where state changes are recorded as a sequence of events rather than just storing the current state. This provides a complete history of changes and allows for powerful capabilities like replaying events, temporal querying, and more robust auditing.
Getting Started
To use this package, install it via NuGet:
dotnet add package Microsoft.Orleans.EventSourcing
Example - Creating an Event-Sourced Grain
using Orleans;
using Orleans.EventSourcing;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
// Define grain state and events
namespace BankAccount;
public class BankAccountState
{
public decimal Balance { get; set; }
public string AccountHolder { get; set; }
public int Version { get; set; }
}
public class DepositEvent
{
public decimal Amount { get; set; }
}
public class WithdrawalEvent
{
public decimal Amount { get; set; }
}
// Grain interface
public interface IBankAccountGrain : IGrainWithStringKey
{
Task<decimal> GetBalance();
Task Deposit(decimal amount);
Task Withdraw(decimal amount);
Task<IReadOnlyList<object>> GetHistory();
}
// Event-sourced grain implementation using JournaledGrain
public class BankAccountGrain : JournaledGrain<BankAccountState, object>, IBankAccountGrain
{
public async Task<decimal> GetBalance()
{
// The state is automatically hydrated from the event log
return State.Balance;
}
public async Task Deposit(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("Deposit amount must be positive");
// Record the event - this will be persisted and applied to state
RaiseEvent(new DepositEvent { Amount = amount });
// Confirm the event is persisted
await ConfirmEvents();
}
public async Task Withdraw(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("Withdrawal amount must be positive");
if (State.Balance < amount)
throw new InvalidOperationException("Insufficient funds");
// Record the event
RaiseEvent(new WithdrawalEvent { Amount = amount });
// Confirm the event is persisted
await ConfirmEvents();
}
public Task<IReadOnlyList<object>> GetHistory()
{
// Return the complete history of events
return Task.FromResult<IReadOnlyList<object>>(RetrieveConfirmedEvents(0, Version).ToList());
}
// Event handlers to update the state based on events
protected override void ApplyEvent(object @event)
{
switch (@event)
{
case DepositEvent deposit:
State.Balance += deposit.Amount;
break;
case WithdrawalEvent withdrawal:
State.Balance -= withdrawal.Amount;
break;
}
}
}
Example - Configuring Event Sourcing with Storage
using Microsoft.Extensions.Hosting;
using Orleans.Configuration;
using Orleans.Hosting;
using Orleans.EventSourcing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading.Tasks;
var builder = Host.CreateApplicationBuilder(args)
.UseOrleans(siloBuilder =>
{
siloBuilder
.UseLocalhostClustering()
// Configure the log consistency provider for event sourcing
.AddLogStorageBasedLogConsistencyProvider("LogStorage")
// Configure a storage provider to store the events
.AddMemoryGrainStorage("PubSubStore")
.ConfigureServices(services =>
{
// Configure default log consistency provider
services.Configure<JournaledGrainOptions>(options =>
{
options.DefaultLogConsistencyProvider = "LogStorage";
});
});
});
var host = builder.Build();
await host.StartAsync();
// Get a reference to a grain and call it
var client = host.Services.GetRequiredService<IClusterClient>();
var bankAccount = client.GetGrain<IBankAccountGrain>("account-123");
// Call grain methods
await bankAccount.Deposit(100);
await bankAccount.Withdraw(25);
var balance = await bankAccount.GetBalance();
// Print the result
Console.WriteLine($"Account balance: ${balance}");
var history = await bankAccount.GetHistory();
Console.WriteLine($"Transaction history: {history.Count} events");
// Keep the host running until the application is shut down
await host.WaitForShutdownAsync();
Documentation
For more comprehensive documentation, please refer to:
Feedback & Contributing
- If you have any issues or would like to provide feedback, please open an issue on GitHub
- Join our community on Discord
- Follow the @msftorleans Twitter account for Orleans announcements
- Contributions are welcome! Please review our contribution guidelines
- This project is licensed under the MIT license
| Product | Versions 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 was computed. 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.
-
net9.0
- Microsoft.AspNetCore.Connections.Abstractions (>= 8.0.11)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.Common (>= 4.5.0)
- Microsoft.CodeAnalysis.Workspaces.Common (>= 4.5.0)
- Microsoft.Extensions.Configuration (>= 8.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 8.0.2)
- Microsoft.Extensions.Configuration.Json (>= 8.0.1)
- Microsoft.Extensions.DependencyInjection (>= 8.0.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.DependencyModel (>= 8.0.2)
- Microsoft.Extensions.Hosting (>= 8.0.1)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Logging (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.3)
- Microsoft.Extensions.Logging.Console (>= 8.0.1)
- Microsoft.Extensions.Logging.Debug (>= 8.0.1)
- Microsoft.Extensions.ObjectPool (>= 8.0.11)
- Microsoft.Extensions.Options (>= 8.0.2)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- Microsoft.Orleans.Analyzers (>= 9.3.0)
- Microsoft.Orleans.CodeGenerator (>= 9.3.0)
- Microsoft.Orleans.Runtime (>= 9.3.0)
- Newtonsoft.Json (>= 13.0.3)
- System.Collections.Immutable (>= 8.0.0)
- System.IO.Hashing (>= 8.0.0)
- System.IO.Pipelines (>= 8.0.0)
- System.Memory.Data (>= 8.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 9.3.0 | 313 | 11/17/2025 |