Event Souring Library that allows storing Events into a Database. Comes with an implementation of a Azure CosmosDb EventStore.
The CosmosDb Implementation uses the following Microsoft libraries:
Microsoft.Azure.CosmosMicrosoft.Extensions.Configuration.AbstractionsMicrosoft.Extensions.Configuration.BinderMicrosoft.Extensions.Logging.AbstractionsMicrosoft.Extensions.Options
and comes with included compatability to the dependency injection of the .NET Core (Web)HostBuilder.
A Sample can be found in the samples directory.
The library brings a couple of already implemented EventStore packages:
- Papst.EventStore.FileSystem
Note: This is for testing purpose only! - Papst.EventStore.EntityFrameworkCore
- Papst.EventStore.AzureCosmos
- Papst.EventStore.AzureBlob
- Events must be attributed with the
EventNameattribute. - EventAggregators, implementing the interface
IEventAggregatoror implementing the abstract classEventAggregatorBaseare automatically added to the Dependency Injection.
It is possible to have multiple EventName attributes on just one event. With the attribute IsWriteName it is possible to define which Identifier is used when writing the event.
[EventName(Name = "MyEventV1", IsWriteName = false)]
[EventName(Name = "MyEventV2")]
public class MyEventsourcingEvent
{
}Reading Events named MyEventV1 or MyEventV2 will deserialize them into a MyEventsourcingEvent.
Writing MyEventsourcingEvent to the Event Stream, will serialize them and name them MyEventV2.
Note: IsWriteName is true by default!
Please refer to the documentation in the relevant implementation sources:
V5.2 introduces Metadata on the Stream itself. The IEventStream now got its own metadata Property.
Meta Data for the Stream needs to be set during creation, otherwise it will be empty. To Create a stream with Meta Data the IEventStorehas got a new extended CreateAsync method that takes the additional metadata.
Only the Azure Cosmos Implementation offers a new option in the configuration that updates the TenantId based on the last set event.
V5 comes with a new access model to the streams, with paging and a new library structure.
V5 Supports only .NET 8.0 and upwards
It introduces a separation of EventStore and EventStream. The EventStore now only offers the possibility to create or retrieve streams.
- The
IEventStoreinterface no longer has methods to append to the EventStream - The new
IEventStreamneeds an index document, which needs to be added to existing event streams. See Migration Chapter in Cosmos DB Implementation. - The
IEventStreamAggregatorimplementation that uses the code generated events has moved to a own package to allow removing active code from thePapst.EventStorepackage. - The
EventNameAttribute now uses positional parameters, provided by a constructor. - A single EventStream can no longer contain Events for multiple Entities.
- The
IEventStreamAggregatornow usesValueTaskinstead ofTask
- Meta Data Properties are now of type
string?instead ofGuid?to achieve greater compatability.
- V4 only supports .NET 6.0
It introduces the concept of Code Generated registration of events and aggregators by decorating them with the EventName attribute.
It also decouples the auto generated event type descriptor (was basically a description used to revert to a type using Type.GetType()) from the concrete implementation.
This allows to version and migrate events by just adding a different descriptor.
A sample on how to use the Event Descriptors is found under Samples. The Extension Method AddCodeGeneratedEvents() is automatically generated during compilation if the package Papst.EventStore.CodeGeneration is added to the Project.
Migrate v3 events by adding a EventName attribute and add the typename as a name: [Fullename of the type],[assembly name of the type].
For the MyEventSourcingEvent in the Code Generation Sample it would look like this:
SampleCodeGeneratedEvents.MyEventSourcingEvent,SampleCodeGeneratedEvents
V4 removes support for authenticating with shared keys against the cosmos DB. The implementation is still there, but changed and marked as obsolete.
V3 supports mainly .NET 5.0 and registration of events and event aggregators through reflection