public async Task <TAggregate> Load <TAggregate, T>(T id, AggregateStoreOptions options = null) where TAggregate : IAggregateRoot { var aggregate = (TAggregate)Activator.CreateInstance(typeof(TAggregate), true); var streamId = aggregate.GetType().Name + "-" + id; var eventDatas = await _eventStore.Read(streamId); var enumerable = eventDatas as EventStore[] ?? eventDatas.ToArray(); if (!enumerable.Any()) { throw new Exception(nameof(TAggregate)); } //TODO: Idea: YAGNI, We can include a new option that choose the servicebus (azure, rabbit, etc.) and use a Factory if (options != null & options.PublishEvents) { foreach (var eventData in enumerable) { aggregate.Hydrate(eventData.StreamData as IDomainEvent); } } return(aggregate); }
public async Task Save <TAggregate, T>(TAggregate aggregate, T id, AggregateStoreOptions options = null) where TAggregate : IAggregateRoot { var streamType = aggregate.GetType().Name; var streamId = streamType + "-" + id; var events = aggregate.DomainEvents.ToArray(); var expectedVersion = aggregate.Version - events.Length; var metadata = new Dictionary <string, object> { { "streamid", streamId }, { "last-version", aggregate.Version }, { "expected-version", expectedVersion }, { "options", JsonSerializer.Serialize(options) } }; var eventDatas = await _eventStore.Save(streamId, streamType, events, expectedVersion, metadata); if (options != null & options.PublishEvents) { //TODO: Idea: YAGNI, We can include a new option that choose the service bus (azure, rabbit, etc.) and use a Factory foreach (var eventData in eventDatas) { await _eventPublisher.Publish(eventData, eventData.Event.EventId, eventData.Stream.StreamId); } } }