Exemplo n.º 1
0
        public async Task Save(AggregateRoot aggregate)
        {
            var uncommittedChanges = aggregate.GetUncommittedChanges();
            var version            = aggregate.Version;

            foreach (var @event in uncommittedChanges)
            {
                version++;
                if (version > 2)
                {
                    if (version % 3 == 0)
                    {
                        var originator = (IOriginator)aggregate;
                        var memento    = originator.GetMemento();
                        memento.Version = version;
                        await SaveMemento(memento).ConfigureAwait(false);
                    }
                }

                @event.Version    = version;
                aggregate.Version = version;

                if (version == 0)
                {
                    var ag = await _aggregateRepository.Create(_aggregateMapper.ToProviderEntity(aggregate)).ConfigureAwait(false);

                    @event.AggregateId = ag.Id;
                }
                else
                {
                    var aggregateRoots = await _aggregateRepository.FindByAsync(x => x.Id == aggregate.Id).ConfigureAwait(false);

                    var aggregateRoot = aggregateRoots.FirstOrDefault();

                    if (aggregateRoot == null)
                    {
                        throw new NullReferenceException();
                    }

                    aggregateRoot.Version = version;
                    await _aggregateRepository.Update(aggregateRoot).ConfigureAwait(false);
                }

                await _eventRepository.Create(_eventMapper.ToProviderEntity(@event)).ConfigureAwait(false);
            }

            foreach (var @event in uncommittedChanges)
            {
                var desEvent = Converter.ChangeTo(@event, @event.GetType());
                await _eventBus.Publish(desEvent).ConfigureAwait(false);
            }
        }
Exemplo n.º 2
0
        public async void UserCategoryCreateCommandStoresAggregateRootInEventStore()
        {
            //Arrange
            var catName = "Test Category 345";
            var command = new UserCategoryCreateCommand(catName);

            //Act
            await _commandBus.Send(command);

            var agg = (await _aggregateRepository.FindByAsync(x => x.Id == 1)).FirstOrDefault();

            //Assert
            Assert.IsNotNull(agg);
            Assert.AreEqual(0, agg.Version);
        }