Async/await first CQRS+ES and DDD framework for .NET
Read the complete migration guide to get the full list of changes as well as recommendations on how to do the migration.
https://github.com/eventflow/EventFlow/blob/develop-v1/MIGRATION_GUIDE.md
(If you see any changes you feel ownership of and you want you name there, create an issue and it will get fixed asap. EventFlow would be where it is today without the grate community contributions that it have received over the years)
Changes since last 1.x pre-release, 1.0.5002-alpha
EventFlow.Redis
(by @joshua211)EventFlow.RabbitMQ
to v1 (by @kyle-bradley)EventFlow.Shims.Tasks
class that provided a wrapper for Task.CompletedTask
in frameworks that did not have itChanges since last 1.x pre-release, 1.0.5001-alpha
IEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,
use the new base class EventUpgraderNonAsync
for any existing upgraders. Its a abstract
class that implements the updated interface and provides a abstract
method with the same
signature as the previous interfaceIEventUpgradeContext
,
which is created by the new IEventUpgradeContextFactory
. Replace this if you need addition
context during event upgradesSnapshotAggregateRoot
now correctly loads previous source IDs as well
adds the current source ID that triggered the snapshot. This causes the
DuplicateOperationException
to be correctly thrown if a duplicate source
ID as added before a snapshot was takenNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS
vulnerability
UseFilesEventPersistence
should no longer throw exception for .NET regarding relative pathsComplete 1.0 change log
EventFlow.Redis
(by @joshua211)Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
[SqlReadModelConnectionStringName]
attribute. To allow executing queries using different
connection strings, all methods on IMsSqlConnection
and ISqlConnection
now have an
additional argument, string connectionStringName
to signify which connection string
should be used for the querySqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing more
control of the connection string used at runtimeIEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,
use the new base class EventUpgraderNonAsync
for any existing upgraders. Its a abstract
class that implements the updated interface and provides a abstract
method with the same
signature as the previous interfaceSetUpgradeExecutionTimeout(...)
on the SQL configurationIEventUpgradeContext
,
which is created by the new IEventUpgradeContextFactory
. Replace this if you need addition
context during event upgradesSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have been
made async and have an extra CancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methods
that used it
IAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
EventFlow.Shims.Tasks
class that provided a wrapper for Task.CompletedTask
in frameworks that did not have itSnapshotAggregateRoot
now correctly loads previous source IDs as well
adds the current source ID that triggered the snapshot. This causes the
DuplicateOperationException
to be correctly thrown if a duplicate source
ID as added before a snapshot was takenNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS
vulnerability
0.83.4713
. 0.x changes are merged to 1.x at regular
intervals, but might be one or two releases behindIMPORTANT: Major API breaking changes might occur between 1.0 pre-releases. As breaking API changes will need to be tested and verified before the final 1.0 release.
Read the complete migration guide to get the full list of changes as well as recommendations on how to do the migration.
https://github.com/eventflow/EventFlow/blob/develop-v1/MIGRATION_GUIDE.md
Changes since last 1.x pre-release, 1.0.5001-alpha
IEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,
use the new base class EventUpgraderNonAsync
for any existing upgraders. Its a abstract
class that implements the updated interface and provides a abstract
method with the same
signature as the previous interfaceIEventUpgradeContext
,
which is created by the new IEventUpgradeContextFactory
. Replace this if you need addition
context during event upgradesSnapshotAggregateRoot
now correctly loads previous source IDs as well
adds the current source ID that triggered the snapshot. This causes the
DuplicateOperationException
to be correctly thrown if a duplicate source
ID as added before a snapshot was takenNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS
vulnerability
UseFilesEventPersistence
should no longer throw exception for .NET regarding relative pathsComplete 1.0 change log
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
[SqlReadModelConnectionStringName]
attribute. To allow executing queries using different
connection strings, all methods on IMsSqlConnection
and ISqlConnection
now have an
additional argument, string connectionStringName
to signify which connection string
should be used for the querySqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing more
control of the connection string used at runtimeIEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,
use the new base class EventUpgraderNonAsync
for any existing upgraders. Its a abstract
class that implements the updated interface and provides a abstract
method with the same
signature as the previous interfaceIEventUpgradeContext
,
which is created by the new IEventUpgradeContextFactory
. Replace this if you need addition
context during event upgradesSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have been
made async and have an extra CancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methods
that used it
IAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
SnapshotAggregateRoot
now correctly loads previous source IDs as well
adds the current source ID that triggered the snapshot. This causes the
DuplicateOperationException
to be correctly thrown if a duplicate source
ID as added before a snapshot was takenNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS
vulnerability
0.83.4713
. 0.x changes are merged to 1.x at regular
intervals, but might be one or two releases behindIMPORTANT: Major API breaking changes might occur between 1.0 pre-releases. As breaking API changes will need to be tested and verified before the final 1.0 release.
Read the complete migration guide to get the full list of changes as well as recommendations on how to do the migration.
https://github.com/eventflow/EventFlow/blob/develop-v1/MIGRATION_GUIDE.md
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
[SqlReadModelConnectionStringName]
attribute. To allow executing queries using different
connection strings, all methods on IMsSqlConnection
and ISqlConnection
now have an
additional argument, string connectionStringName
to signify which connection string
should be used for the querySqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing more
control of the connection string used at runtimeSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have been
made async and have an extra CancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methods
that used it
IAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
0.83.4713
. 0.x changes are merged to 1.x at regular
intervals, but might be one or two releases behindIMPORTANT: Major API breaking changes might occur between 1.0 pre-releases. As breaking API changes will need to be tested and verified before the final 1.0 release.
Read the complete migration guide to get the full list of changes as well as recommendations on how to do the migration.
https://github.com/eventflow/EventFlow/blob/develop-v1/MIGRATION_GUIDE.md
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
[SqlReadModelConnectionStringName]
attribute. To allow executing queries using different
connection strings, all methods on IMsSqlConnection
and ISqlConnection
now have an
additional argument, string connectionStringName
to signify which connection string
should be used for the querySqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing more
control of the connection string used at runtimeSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have been
made async and have an extra CancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methods
that used it
IAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
0.83.4713
. 0.x changes are merged to 1.x at regular
intervals, but might be one or two releases behindeventFlowOptions.UseHangfireJobScheduler(o => o.UseQueueName("myqueue"))
MetadataKeyNotFoundException
if there is no meta data on
previous_source_ids
in snapshotsEventFlow.EntityFramework
package that allow
us to configure eager loading of related data. Example usage:
public static IEventFlowOptions Configure(this IEventFlowOptions options)
{
return options
.UseEntityFrameworkReadModel<MyEntity, MyDbContext>(
cfg => cfg.Include(x => x.SomeProperty)
.ThenInclude(y => y.SomeOtherProperty)
);
}
Read the complete migration guide to get the full list of changes as well as recommendations on how to do the migration.
https://github.com/eventflow/EventFlow/blob/develop-v1/MIGRATION_GUIDE.md
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
Microsoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methods
that used it.
IAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
ISagaErrorHandler<TSaga>
Id : Identity<Id>
IHangfireJobRunner.Execute
is now IHangfireJobRunner.ExecuteAsync
AggregateReadStoreManager
and SingleAggregateReadStoreManager
into one class in order to always guarantee in-order event processingUseReadStoreFor<,,,>
configuration methods as obsolete,
in favor of the simpler overloads with less type parameters (as those automatically
figure out the AggregateRoot and Id types and configure the more reliable
SingleAggregateReadStoreManager
implementation)AsyncHelper
and all non-async methods using it have been
marked obsolete and will be removed in EventFlow 1.0 (not planned yet). If you rely
on these non-async methods, then merely copy-paste the AsyncHelper
from the EventFlow
code base and continue using it in your transition to async onlyEntityFrameworkEventPersistence
could possibly save aggregate
events out of order, which would lead to out-of-order application when streaming events
ordered by GlobalSequenceNumberFilesEventPersistence
now uses relative pathsIAggregateStoreResilienceStrategy
IDispatchToReadStoresResilienceStrategy
IDispatchToSubscriberResilienceStrategy
ISagaUpdateResilienceStrategy