예제 #1
0
        public async Task <T> Load <T>(Guid aggregateId, CancellationToken cancellationToken = default)
            where T : IAggregate, new()
        {
            var aggregate = new T();

            var containerName = CosmosExtensions.GetContainerName <T>();

            var db = await _client.CreateDatabaseIfNotExistsAsync("LoyaltyCardDB");

            var container = await db.Database.CreateContainerIfNotExistsAsync(containerName, "/AggregateId");

            QueryDefinition query = new QueryDefinition("select * from t where t.AggregateId = @aggregateId")
                                    .WithParameter("@aggregateId", aggregateId.ToString());

            FeedIterator <EventData> queryResultSetIterator = container.Container.GetItemQueryIterator <EventData>(query);

            while (queryResultSetIterator.HasMoreResults)
            {
                FeedResponse <EventData> currentResultSet = await queryResultSetIterator.ReadNextAsync();

                aggregate.Load(
                    currentResultSet.Last().Version,
                    Enumerable.ToArray(currentResultSet.Select(re =>
                                                               _serializer.DeserializeFromJson(re.Data, re.EventType))));
            }

            return(aggregate);
        }