Releases: eventflow/EventFlow
Releases · eventflow/EventFlow
v0.30.2019
- Breaking: To simplify the EventFlow NuGet package structure, the two NuGet
packagesEventFlow.EventStores.MsSql
andEventFlow.ReadStores.MsSql
have
been discontinued and their functionality move to the existing package
EventFlow.MsSql
. The embedded SQL scripts have been made idempotent making
the upgrade a simple operation of merely using the new name spaces. To make
the upgrade easier, the deprecated NuGet packages will still be uploaded,
but will not contain anything - Fixed: When configuring Elasticsearch and using the overload of
ConfigureElasticsearch
that takes multiple of URLs,SniffingConnectionPool
is now used instead ofStaticConnectionPool
and with sniff life span of five
minutes
v0.29.1973
- Breaking:
IAggregateRoot
has some breaking changes. If these methods aren't
used (which is considered the typical case), then the base class
AggregateRoot<,,>
will automatically handle itCommitAsync
has an additionalISnapshotStore
parameter. If you don't
use snapshot aggregates, then you can safely passnull
LoadAsync
is a new method that lets the aggregate control how its
loaded fromt the event- and snapshot stores
- New core feature: EventFlow now support snapshot creation for aggregate
roots. The EventFlow documentation has been updated to include a guide on
how to get started using snapshots. Snapshots are basically an opt-in optimized
method for handling long-lived aggregate roots. Snapshot support in EventFlow
introduces several new elements, read the documentation to get an overview.
Currently EventFlow offers the following snapshot stores- In-memory
- Microsoft SQL Server
- New: The
IAggregateStore
is introduced, which provides a cleaner interface
for manipulating aggregate roots. The most important method is the
UpdateAsync
which allows easy updates to aggregate roots without the need
for a command and command handlerLoadAsync
UpdateAsync
StoreAsync
- New:
IEventStore
now supports loading events from a specific version using
the new overload ofLoadEventsAsync
that takes afromEventSequenceNumber
argument - New:
IMsSqlDatabaseMigrator
now has a overloaded method named
MigrateDatabaseUsingScripts
that takes anIEnumerable<SqlScript>
enabling specific scripts to be used in a database migration - New: Added suport to use EventStore persistence with connection strings
instead IPs only - Obsolete: The following aggregate related methods on
IEventStore
has been
marked as obsolete in favor of the newIAggregateStore
. The methods will be
removed at some point in the futureLoadAggregateAsync
LoadAggregate
v0.28.1852
- Critical fix:
OptimisticConcurrencyRetryStrategy
now correctly only
states thatOptimisticConcurrencyException
should be retried. Before
ALL exceptions from the event stores were retried, not only the transient!
If you have inadvertently become dependent on this bug, then implement your
ownIOptimisticConcurrencyRetryStrategy
that has the old behavior - Fixed:
OptimisticConcurrencyRetryStrategy
has a off-by-one error that caused
it to retry one less that it actually should - Fixed: Prevent
abstract ICommandHandler<,,,>
from being registered in
EventFlowOptionsCommandHandlerExtensions.AddCommandHandlers(...)
- Fixed: Prevent
abstract IEventUpgrader<,>
from being registered in
EventFlowOptionsEventUpgradersExtensions.AddEventUpgraders(...)
- Fixed: Prevent
abstract IMetadataProvider
from being registered in
EventFlowOptionsMetadataProvidersExtensions.AddMetadataProviders(...)
- Fixed: Prevent
abstract IQueryHandler<,>
from being registered in
EventFlowOptionsQueriesExtensions.AddQueryHandlers(...)
- Fixed: Prevent
abstract ISubscribeSynchronousTo<,,>
from being registered in
EventFlowOptionsSubscriberExtensions.AddSubscribers(...)
v0.27.1765
- New: Configure Hangfire job display names by implementing
IJobDisplayNameBuilder
. The default implementation uses job description
name and version
v0.26.1714
- Breaking: Renamed
MssqlMigrationException
toSqlMigrationException
- Breaking: Renamed
SqlErrorRetryStrategy
toMsSqlErrorRetryStrategy
as its MSSQL specific - Breaking: The NuGet package
Dapper
is no longer IL merged with the package
EventFlow.MsSql
but is now listed as a NuGet dependency. The current
version used by EventFlow isv1.42
- New: Introduced the NuGet package
EventFlow.SQLite
that adds event store
support for SQLite databases, both as event store and read model store - New: Introduced the NuGet package
EventFlow.Sql
as shared package for
EventFlow packages that uses SQL - New: Its now possible to configure the retry delay for MSSQL transient
errors using the newIMsSqlConfiguration.SetTransientRetryDelay
. The
default is a random delay between 50 and 100 milliseconds
v0.25.1695
-
Fixed: Deadlock in
AsyncHelper
if e.g. an exception caused noasync
tasks
to be scheduled. TheAsyncHelper
is used by EventFlow to expose non-async
methods to developers and provide the means to callasync
methods from
a synchronous context without causing a deadlock. There's no change to any of
theasync
methods.The
AsyncHelper
is used in the following methods.ICommandBus.Publish
IEventStore.LoadEvents
IEventStore.LoadAggregate
IEventStore.LoadAllEvents
IJobRunner.Execute
IReadModelPopulator.Populate
IReadModelPopulator.Purge
IQueryProcessor.Process
v0.24.1563
- Breaking: The following NuGet references have been updated
EventStore.Client
v3.4.0 (up from v3.0.2)Hangfire.Core
v1.5.3 (up from v1.4.6)RabbitMQ.Client
v3.6.0 (up from v3.5.4)
- New: EventFlow now uses Paket to manage NuGet packages
- Fixed: Incorrect use of
EventStore.Client
that caused it to throw
WrongExpectedVersionException
when committing aggregates multiple times - Fixed: Updated NuGet package titles of the following NuGet packages to
contain assembly name to get a better overview when searching on
nuget.orgEventFlow.RabbitMQ
EventFlow.EventStores.EventStore
- Fixed: Updated internal NuGet reference
dbup
to v3.3.0 (up from v3.2.1)
v0.23.1470
- Breaking: EventFlow no longer ignores columns named
Id
in MSSQL read models.
If you were dependent on this, use theMsSqlReadModelIgnoreColumn
attribute - Fixed: Instead of using
MethodInfo.Invoke
to call methods on reflected
types, e.g. when a command is published, EventFlow now compiles an expression
tree instead. This has a slight initial overhead, but provides a significant
performance improvement for subsequent calls - Fixed: Read model stores are only invoked if there's any read model updates
- Fixed: EventFlow now correctly throws an
ArgumentException
if EventFlow has
been incorrectly configure with known versioned types, e.g. an event
is emitted that hasn't been added during EventFlow initialization. EventFlow
would handle the save operation correctly, but if EventFlow was reinitialized
and the event was loaded before it being emitted again, an exception would
be thrown as EventFlow would know which type to use. Please make sure to
correctly load all event, command and job types before use - Fixed:
IReadModelFactory<>.CreateAsync(...)
is now correctly used in
read store mangers - Fixed: Versioned type naming convention now allows numbers
v0.22.1393
- New: To customize how a specific read model is initially created, implement
a specificIReadModelFactory<>
that can bootstrap that read model - New: How EventFlow handles MSSQL read models has been refactored to allow
significantly more freedom to developers. MSSQL read models are no longer
required to implementIMssqlReadModel
, only the emptyIReadModel
interface. Effectively, this means that no specific columns are required,
meaning that the following columns are no longer enforced on MSSQL read
models. Use the new requiredMsSqlReadModelIdentityColumn
attribute to mark
the identity column and the optional (but recommended)
MsSqlReadModelVersionColumn
to mark the version column.string AggregateId
DateTimeOffset CreateTime
DateTimeOffset UpdatedTime
int LastAggregateSequenceNumber
- Obsolete:
IMssqlReadModel
andMssqlReadModel
. Developers should instead
use theMsSqlReadModelIdentityColumn
andMsSqlReadModelVersionColumn
attributes to mark the identity and version columns (read above).
EventFlow will continue to supportIMssqlReadModel
, but it will be
removed at some point in the future - Fixed: Added missing
UseElasticsearchReadModel<TReadModel, TReadModelLocator>()
extension
v0.21.1312
- New: Added
Identity<>.NewComb()
that creates sequential unique IDs which can
be used to minimize database fragmentation - New: Added
IReadModelContext.Resolver
to allow read models to fetch
additional resources when events are applied - New: The
PrettyPrint()
type extension method, mostly used for verbose
logging, now prints even prettier type names, e.g.
KeyValuePair<Boolean,Int64>
instead of merelyKeyValuePair'2
, making log
messages slightly more readable