Releases: eventflow/EventFlow
v0.57.3359
- Fixed: AggregateException/InvalidOperationException when reading and updating
an aggregate from different threads at the same time usingInMemoryEventPersistence - New: .NET standard 1.6 and 2.0 support for
EventFlow.MsSqlpackage
v0.56.3328
- New: Allow enums to be used in
SingleValueObject<T>and protect from
undefined enum values
v0.55.3323
- Fixed: Re-populating events to read models that span multiple aggregates
now has events orderd by timestamp instead of sequence numbers, i.e., events
from aggregates with higher sequences numbers isn't forced last - New: Trigger sagas without the need of any domain events by using
ISagaStore.UpdateAsync(...) - New: .NET standard 2.0 (still supports 1.6) support added to these
NuGet packages- EventFlow
- EventFlow.Autofac
- EventFlow.Elasticsearch
- EventFlow.Hangfire
- EventFlow.Sql
v0.54.3261
- Critical fix:
SagaAggregateStorewas incorrectly putting an object reference
into its memory cache causing an object already disposed exception when working with
sagas - New: Added LibLog, enable by
calling theIEventFlowOptions.UseLibLog(...)extension
v0.53.3204
- New: Allow events to have multiple
EventVersionattributes - Fixed:
ReflectionHelper.CompileMethodInvocationnow recognises
privatemethods.
v0.52.3178
- Fixed:
.UseFilesEventStorenow uses a thread safe singleton instance for
file system persistence, making it suitable for use in multi-threaded unit
tests. Please don't use the files event store in production scenarios - New: Support for unicode characters in type names. This simplifies using an
ubiquitous language
in non-english domains - Fixed: Include hyphen in prefix validation for identity values. This fixes a bug
where invalid identities could be created (e.g.ThingyId.With("thingyINVALID-a41e..."))
v0.51.3155
- New: Removed the
new()requirement for read models - New: If
ISagaLocator.LocateSagaAsynccannot identify the saga for a given
event, it may now returnTask.FromResult(null)in order to short-circuit
the dispatching process. This might be useful in cases where some instances
of an event belong to a saga process while others don't - Fixed:
StringExtensions.ToSha256()can now be safely used from
concurrent threads.
v0.50.3124
-
New: While EventFlow tries to limit the about of painful API changes, the
introduction of execution/command results are considered a necessary step
towards as better API.Commands and command handlers have been updated to support execution
results. Execution results is meant to be an alternative to throwing domain
exceptions to do application flow. In short, before you were required to
throw an exception if you wanted to abort execution and "return" a failure
message.The introduction of execution results changes this, as it allows
returning a failed result that is passed all the way back to the command
publisher. Execution results are generic and can thus contain e.g. any
validation results that a UI might need. TheICommandBus.PublishAsync
signature has changed to reflect this.from
Task<ISourceId> PublishAsync<TAggregate, TIdentity, TSourceIdentity>( ICommand<TAggregate, TIdentity, TSourceIdentity> command) where TAggregate : IAggregateRoot<TIdentity> where TIdentity : IIdentity where TSourceIdentity : ISourceId
to
Task<TExecutionResult> PublishAsync<TAggregate, TIdentity, TExecutionResult>( ICommand<TAggregate, TIdentity, TExecutionResult> command, CancellationToken cancellationToken) where TAggregate : IAggregateRoot<TIdentity> where TIdentity : IIdentity where TExecutionResult : IExecutionResult
Command handler signature has changed from
Task ExecuteAsync( TAggregate aggregate, TCommand command, CancellationToken cancellationToken);
to
Task<TExecutionResult> ExecuteCommandAsync( TAggregate aggregate, TCommand command, CancellationToken cancellationToken)
Migrating to the new structure should be seamless if your current code base
inherits its command handlers from the providedCommandHandler<,,>base
class. -
Breaking: Source IDs on commands have been reworked to "make room" for
execution results on commands. The generic parameter fromICommand<,,>
andICommandHandler<,,,>has been removed in favor of the new execution
results.ICommand.SourceIdis now of typeISourceIdinstead of using
the generic type and theICommandBus.PublishAsyncno longer returns
Task<ISourceId>To get code that behaves similar to the previous version, simply take the
ISourceIdfrom the command, i.e., instead of thisvar sourceId = await commandBus.PublishAsync(command);
write this
await commandBus.PublishAsync(command); var sourceId = command.SourceId;
(
CancellationTokenand.ConfigureAwait(false)omitted fromt he above) -
Breaking: Upgraded NuGet dependency on
RabbitMQ.Clientfrom>= 4.1.3
to>= 5.0.1
v0.49.3031
- Breaking: Upgraded
EventStore.Clientdependency to version 4.0 - Breaking: Changed target framework for
EventFlow.EventStores.EventStoreto
.NET 4.6.2 as required byEventStore.ClientNuGet dependency - Fix:
EventFlow.Hangfirenow depends onHangfire.Coreinstead of
Hangfire - New: Added an overload to
IDomainEventPublisher.PublishAsyncthat isn't
generic and doesn't require an aggregate ID - New: Added
IReadModelPopulator.DeleteAsyncthat allows deletion of single
read models - Obsolete:
IDomainEventPublisher.PublishAsync<,>(generic) in favor of the
new less restrictive non-generic overload
v0.48.2937
- Breaking: Moved non-async methods on
IReadModelPopulatorto extension
methods - New: Added non-generic overloads for purge and populate methods on
IReadModelPopulator - New: Provided
EventFlow.TestHelperswhich contains several test suites
that is useful when developing event and read model stores for EventFlow.
The package is an initial release and its interface is unstable and
subject to change - New: Now possible to configure retry delay for MSSQL error
40501(server
too busy) usingIMsSqlConfiguration.SetServerBusyRetryDelay(RetryDelay) - New: Now possible to configure the retry count of transient exceptions for
MSSQL and SQLite using theISqlConfiguration.SetTransientRetryCount(int) - Fixed: Added MSSQL error codes
10928,10929,18401and40540as well
as a few nativeWin32Exceptionexceptions to the list treated as transient
errors, i.e., EventFlow will automatically retry if the server returns one
of these