Async/await first CQRS+ES and DDD framework for .NET
OTHER License
Bot releases are hidden (Show)
Published by rasmus about 9 years ago
Newtonsoft.Json
to v7.0.1SingleValueObject<>
SingleValueObjectConverter
to help create clean JSON whenRegister(IEventApplier)
toAggregateRoot<,>
that enables developers to override how events areAggregateState<,,>
that developers can use to create aggregateRegister(...)
with the state object as argumentAggregateRoot<,>.Apply(...)
, i.e., methods for applying events,private
and protected
AggregateRoot<,>.Emit(...)
protected and virtual to allowAggregateRoot<,>.ApplyEvent(...)
protected and virtual toDapper
to v1.42 (up from v1.38)Published by rasmus about 9 years ago
IEventStore.LoadAllEventsAsync
and IEventStore.LoadAllEvents
GlobalPosition
as an argument instead of a long
for theGlobalPosition
is basically a wrapper around aEventFlow.EventStores.EventStore
that providesPublished by rasmus over 9 years ago
Breaking: Remove all functionality related to global sequence
numbers as it proved problematic to maintain. It also matches this
quote:
Order is only assured per a handler within an aggregate root
boundary. There is no assurance of order between handlers or
between aggregates. Trying to provide those things leads to
the dark side.Greg Young
LastGlobalSequenceNumber
column during update, or set it toNULL
IDomainEvent.GlobalSequenceNumber
removedIEventStore.LoadEventsAsync
and IEventStore.LoadEvents
takingGlobalSequenceNumberRange
removedBreaking: Remove the concept of event caches. If you really need this
then implement it by registering a decorator for IEventStore
Breaking: Moved IDomainEvent.BatchId
to metadata and created
MetadataKeys.BatchId
to help access it
New: IEventStore.DeleteAggregateAsync
to delete an entire aggregate
stream. Please consider carefully if you really want to use it. Storage
might be cheaper than the historic knowledge within your events
New: IReadModelPopulator
is new and enables you to both purge and
populate read models by going though the entire event store. Currently
its only basic functionality, but more will be added
New: IEventStore
now has LoadAllEventsAsync
and LoadAllEvents
that
enables you to load all events in the event store a few at a time.
New: IMetadata.TimestampEpoch
contains the Unix timestamp version
of IMetadata.Timestamp
. Also, an additional metadata key
timestamp_epoch
is added to events containing the same data. Note,
the TimestampEpoch
on IMetadata
handles cases in which the
timestamp_epoch
is not present by using the existing timestamp
Fixed: AggregateRoot<>
now reads the aggregate version from
domain events applied during aggregate load. This resolves an issue
for when an IEventUpgrader
removed events from the event stream
Fixed: InMemoryReadModelStore<,>
is now thread safe
Published by rasmus over 9 years ago
IQueryProcessor
that enables you to implementReadModelByIdQuery<TReadModel>
: Supported by in-memory and MSSQL readInMemoryQuery<TReadModel>
: Only supported by in-memory read model store,Predicate<TReadModel>
Published by rasmus over 9 years ago
IReadModelLocator
to define how read models are located. The suppliedILocateByAggregateId
simply uses the aggregate ID. To subscribeIAmReadModelFor<,,>
and make sureUseMssqlReadModel
signature changed, change to.UseMssqlReadModel<MyReadModel, ILocateByAggregateId>()
inUseInMemoryReadStoreFor
signature changed, change to.UseInMemoryReadStoreFor<MyReadModel, ILocateByAggregateId>()
inITransientFaultHandler
now takes the strategy as a genericUse<>
method. If you want to configure theConfigureRetryStrategy(...)
insteadIReadStoreManager
if you would like toIEventStore
now has a LoadEventsAsync
and LoadEvents
IDomainEvent
s based on global sequence number rangetypeof(IMyService<>)
astypeof(MyService<>)
TableAttribute
from System.ComponentModel.DataAnnotations
Published by rasmus over 9 years ago
int
in the form{"GlobalSequenceNumber":2}
. So rename the current file and put in theIAggregateRoot
changed to IAggregateRoot<TIdentity>
ICommand<TAggregate>
changed to ICommand<TAggregate,TIdentity>
ICommandHandler<TAggregate,TCommand>
changed toICommandHandler<TAggregate,TIdentity, TCommand>
IAmReadModelFor<TEvent>
changed toIAmReadModelFor<TAggregate,TIdentity,TEvent>
IDomainEvent<TEvent>
changed to IDomainEvent<TAggregate,TIdentity>
ICommandBus.Publish
now takes a CancellationToken
argumentPublished by rasmus over 9 years ago
ValueObject
now uses public properties instead of bothstring
but objects implementingIIdentity
IMsSqlConnection
has an extra Label
argumentITransientFaultHandler
added along with default retry strategiesValueObject
when claculating hashNullReferenceException
thrown if null
was storedSingleValueObject
and ToString()
was calledPublished by rasmus over 9 years ago
First stable version of EventFlow.