Skip to content

Release Notes & History

This log tracks major feature updates and version milestones of the Sharpino library.


  • Version 6.2.7: Updated library dependencies across all core and sample projects.
  • Version 6.2.6:
    • Physical Read/Write DB Separation: Introduced separate readConnection and writeConnection strings in EventStore (PgStorage). Writes (appending events, snapshots) target the primary write database, while queries and state view hydrations can target read replicas for eventual consistency.
    • MailboxProcessor Execution: Reintroduced MailboxProcessor for single-stream / aggregate commands (#if USING_MAILBOXPROCESSOR), providing actor-based sequential execution per aggregate.
  • Version 6.2.5:
    • Integrated AsyncKeyedLock locker for high-concurrency keyed aggregate locks.
    • Added configuration parameter SemaphoreSlimLimit to tune concurrent command throttling.

  • Extended Decision Boundary: Introduces cross-aggregates constraint lambda execution (runThreeAggregateCommandsMdAsync3, etc.) that allows locking external streams under optimistic concurrency check.
  • Added lazy constraint variations of command runner APIs.

  • Postgres Optimistic Lock Control: Switched optimistic lock control validation entirely to Postgres stored procedures.
  • Cache Memory Limits: Introduced L1 configuration parameters to limit cache count and memory footprints:
    • Cache:AggregateCacheMaxSize
    • Cache:AggregateCacheMaxMemoryMegabytes
    • Cache:AggregateCacheMemoryLoadThreshold
  • Postgres LISTEN/NOTIFY Backplane: Added support for L1 cache eviction messages and L2 synchronization using PG native listen/notify channels.

  • Snapshot Upcasting: Native support to evolve, replace, and upcast database-level snapshots.
  • GDPR compliance updates: Added async methods to erase or replace sensitive data in events and snapshots.

  • Moved settings from sharpinoSettings.json to the standard ASP.NET appSettings.json.
  • Added standard cancellation token parameters to all core StateView and CommandHandler functions.
  • Introduced predicate-based soft-deletion for aggregates.

  • Refreshable Details: Introduced Refreshable and RefreshableAsync cached composite read models.
  • Async command executions: Migrated core database calls and cache fetches to async/task-based patterns.

  • Integrated state caches (StateCache2).
  • Transport Tycoon sample (Sample 8) added.

  • Ditched Newtonsoft.Json in favor of FsPickler binary and JSON serialization support.
  • Replaced Kafka notifications with PostgreSQL-centric notification triggers and standard message senders.