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);
                }
            }
        }