Async/await first CQRS+ES and DDD framework for .NET
OTHER License
Bot releases are visible (Hide)
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.5003-alpha
IEventStore
to load events to a given sequence number (thanks @SeWaS)EventFlow.Hangfire
now part of the v1 release cycle (thanks @nicolaj-hartmann)System.Data.SqlClient
to Microsoft.Data.SqlClient
(thanks @janrybka)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
Changes since last 1.x pre-release, 1.0.5001-alpha
IEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSnapshotAggregateRoot
now correctly loads previous source IDs as wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoSUseFilesEventPersistence
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 differentIMsSqlConnection
and ISqlConnection
now have anstring connectionStringName
to signify which connection stringSqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing moreIEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameSetUpgradeExecutionTimeout(...)
on the SQL configurationIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have beenCancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methodsIAggregateStore.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
SnapshotAggregateRoot
now correctly loads previous source IDs as wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS0.83.4713
. 0.x changes are merged to 1.x at regularPublished by rasmus over 1 year ago
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
Changes since last 1.x pre-release, 1.0.5001-alpha
IEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSnapshotAggregateRoot
now correctly loads previous source IDs as wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoSUseFilesEventPersistence
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 differentIMsSqlConnection
and ISqlConnection
now have anstring connectionStringName
to signify which connection stringSqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing moreIEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameSetUpgradeExecutionTimeout(...)
on the SQL configurationIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have beenCancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methodsIAggregateStore.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
SnapshotAggregateRoot
now correctly loads previous source IDs as wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS0.83.4713
. 0.x changes are merged to 1.x at regularPublished by rasmus almost 2 years ago
IMPORTANT: 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,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSnapshotAggregateRoot
now correctly loads previous source IDs as wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoSUseFilesEventPersistence
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 differentIMsSqlConnection
and ISqlConnection
now have anstring connectionStringName
to signify which connection stringSqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing moreIEventUpgrader<,>
are now (finally) async. For an easy upgrade experience,EventUpgraderNonAsync
for any existing upgraders. Its a abstract
abstract
method with the sameIEventUpgradeContext
,IEventUpgradeContextFactory
. Replace this if you need additionSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have beenCancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methodsIAggregateStore.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 wellDuplicateOperationException
to be correctly thrown if a duplicate sourceNewtonsoft.Json
from 11.0.2
to 13.0.1
to fix DoS0.83.4713
. 0.x changes are merged to 1.x at regularPublished by rasmus over 2 years ago
IMPORTANT: 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 differentIMsSqlConnection
and ISqlConnection
now have anstring connectionStringName
to signify which connection stringSqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing moreSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have beenCancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methodsIAggregateStore.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 regularPublished by rasmus about 3 years ago
IMPORTANT: 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 differentIMsSqlConnection
and ISqlConnection
now have anstring connectionStringName
to signify which connection stringSqlConfiguration<T>.GetConnectionStringAsync(...)
instead of a property, allowing moreSetUpgradeExecutionTimeout(...)
on the SQL configurationSql...
instead of MsSql...
MsSqlReadModelIdentityColumn
MsSqlReadModelIgnoreColumn
MsSqlReadModelVersionColumn
IMsSqlDatabaseMigrator
and ISqlDatabaseMigrator
have beenCancellationToken
argumentMicrosoft.Extensions.Caching.Memory
IAmAsyncReadModelFor
and made IAmReadModelFor
asyncEventFlow.Core.AsyncHelper
as well as all async wrapper methodsIAggregateStore.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 regularPublished by rasmus about 3 years ago
eventFlowOptions.UseHangfireJobScheduler(o => o.UseQueueName("myqueue"))
MetadataKeyNotFoundException
if there is no meta data onprevious_source_ids
in snapshotsPublished by rasmus about 3 years ago
EventFlow.EntityFramework
package that allowpublic static IEventFlowOptions Configure(this IEventFlowOptions options)
{
return options
.UseEntityFrameworkReadModel<MyEntity, MyDbContext>(
cfg => cfg.Include(x => x.SomeProperty)
.ThenInclude(y => y.SomeOtherProperty)
);
}
Published by rasmus over 3 years ago
Published by rasmus over 3 years ago
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 methodsIAggregateStore.Load
IAggregateStore.Store
IAggregateStore.Update
ICommandBus.Publish
IEventStore.LoadAggregate
IEventStore.LoadEvents
IEventStore.LoadAllEvents
IQueryProcessor.Process
IReadModelPopulator.Populate
IReadModelPopulator.Purge
Published by rasmus almost 4 years ago
ISagaErrorHandler<TSaga>
Id : Identity<Id>
Published by rasmus about 4 years ago
IHangfireJobRunner.Execute
is now IHangfireJobRunner.ExecuteAsync
AggregateReadStoreManager
and SingleAggregateReadStoreManager
UseReadStoreFor<,,,>
configuration methods as obsolete,SingleAggregateReadStoreManager
implementation)AsyncHelper
and all non-async methods using it have beenAsyncHelper
from the EventFlowEntityFrameworkEventPersistence
could possibly save aggregateFilesEventPersistence
now uses relative pathsIAggregateStoreResilienceStrategy
IDispatchToReadStoresResilienceStrategy
IDispatchToSubscriberResilienceStrategy
ISagaUpdateResilienceStrategy
Published by rasmus over 4 years ago
EventFlow
EventFlow.EntityFramework
packagesPublished by rasmus over 4 years ago
AggregateRoot<,>
virtual
to allow -- query before the fix
UPDATE [ReadModel-TestAttributes]
SET UpdatedTime = @UpdatedTime
WHERE Id = @Id
-- query after the fix
UPDATE [ReadModel-TestAttributes]
SET [UpdatedTime] = @UpdatedTime
WHERE [Id] = @Id
null
predicate to AddCommands
and AddJobs
Published by rasmus almost 5 years ago
EventFlow.AspNetCore
NuGet package now has ASP.NET Core 3 supportPublished by rasmus almost 5 years ago
MongoDbReadModelStore readModelStore;
IQueryable<TReadModel> queryable = readModelStore.AsQueryable();
RabbitMqPublisher
to a new virtualnew()
generic requirement,Published by rasmus about 5 years ago
"null"
into a struct value likeint
, the SingleValueObjectConverter
threw an exception instead ofnull
representing an absent SingleValueObject<int>
valuePublished by rasmus over 5 years ago
AspNetCoreEventFlowOptions.AddMetadataProviders()
AddDefaultMetadataProviders()
and made AddUserClaimsMetadata
opt-inIEmit<>
in aggregate roots.AddAspNetCore()
with defaults now doesn't throw a DIPublished by rasmus over 5 years ago
EventFlowOptions.New.
.ConfigureJson(json => json
.AddSingleValueObjects()
.AddConverter<SomeConverter>()
)
services.AddEventFlow(o => o.AddAspNetCore(c => {...}));
(old syntaxAddAspNetCoreMetadataProviders
is now deprecated)..RunBootstrapperOnHostStartup()
runs bootstrappers together with ASP.NETAddAspNetCoreMetadataProviders
.UseMvcJsonOptions()
adds EventFlow JSON configuration (see below) to ASP.NET Core,.Add{Whatever}Metadata()
configures specific metadata provider..AddUserClaimsMetadata(params string claimTypes)
configures the new claims metadata.UseLogging()
configures an adapter for Microsoft.Extensions.Logging.UseModelBinding()
adds model binding support for Single Value Objects:
[HttpGet("customers/{id}")]
public async Task<IActionResult> SingleValue(CustomerId id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
AddRequestHeadersMetadataProvider
doesn't throw whenReadModelRepopulator
now correctly populates IAmAsyncReadModelFor
Published by rasmus over 5 years ago
EventFlow.TestHelpers
are now released as .NET Standard as wellEventStore.Client
to v5.0.1 and use it for both .NET Framework and .NET CoreMsSqlEventPersistence
now correctlyPublished by rasmus over 5 years ago
false
IExecutionResult.IsSuccess
will newly lead to an exception being thrown.AggregateSaga.ThrowExceptionsOnFailedPublish
to false
in your AggregateSaga constructor.false
in IExecutionResult.IsSuccess
ISagaErrorHandler
implementation to reflect new exception structure,