Пример #1
0
        public async Task TakeAndSaveAsync(IAggregateRoot aggregate)
        {
            var snapshot = aggregate.ToSnapshot();

            string insertScript = EventRepositoryScriptsAsStrings.InsertSnapshot();

            await _databaseProvider.ExecuteAsync(insertScript, snapshot);

            Log.Information($"Snapshot for aggregate {aggregate.GetType().Name} has been created from version {aggregate.Version}");
        }
Пример #2
0
        public async Task <IEnumerable <IEvent> > GetFromAsync <T>(Guid aggregateId, int fromVersion = 0)
        {
            var getAggregateSql = EventRepositoryScriptsAsStrings.GetFromVersion(typeof(T).Name, aggregateId, fromVersion);
            var listOfEventData = await _databaseProvider.QueryAsync <EventData>(getAggregateSql, new { aggregateId });

            if (listOfEventData == null || !listOfEventData.Any())
            {
                throw new StocqresException("Aggregate doesn't exist");
            }

            return(listOfEventData.OrderBy(e => e.Version).Select(x => x.DeserializeEvent()));
        }
Пример #3
0
        public async Task ValidateVersionAsync <T>(Guid aggregateId, int originalVersion)
        {
            var aggregateTypeName = typeof(T).Name;

            var foundVersionQuery =
                EventRepositoryScriptsAsStrings.FindAggregateVersion(aggregateTypeName, aggregateId);
            var foundVersionResult = await _databaseProvider.ExecuteScalarAsync(foundVersionQuery);

            if ((int?)foundVersionResult >= originalVersion)
            {
                Log.Error("Concurrency Exception");
                throw new Exception("Concurrency Exception");
            }
        }
Пример #4
0
        public async Task SaveAsync <T>(IEnumerable <IEvent> events, Guid aggregateId, int originalVersion)
        {
            var validator = ValidateVersionAsync <T>(aggregateId, originalVersion);

            var aggregateType = typeof(T).Name;

            var eventsToSave = events.Select(e => e.ToEventData(aggregateId, aggregateType, originalVersion++, DateTime.Now));

            string insertScript = EventRepositoryScriptsAsStrings.InsertIntoAggregate(aggregateType);

            await validator;

            await _databaseProvider.ExecuteAsync(insertScript, eventsToSave);

            Log.Information($"Events for aggregate {aggregateType} with Id {aggregateId} has been saved.");
        }
Пример #5
0
 public async Task<Snapshot> GetLastAsync(Guid aggregateId)
 {
     var sql = EventRepositoryScriptsAsStrings.GetAggregateSnapshot(aggregateId);
     return await _databaseProvider.QueryFirstOrDefaultAsync<Snapshot>(sql);
 }