Example #1
0
        public void Save(SaveStoreData request)
        {
            var aggregateFilter = Builders <AggregateDocument> .Filter.Eq("_id", request.AggregateRootId.ToString());

            var aggregateDocument = _dbContext.Aggregates.Find(aggregateFilter).FirstOrDefault();

            if (aggregateDocument == null)
            {
                var newAggregateDocument = _aggregateDocumentFactory.CreateAggregate(request.AggregateType, request.AggregateRootId);
                _dbContext.Aggregates.InsertOne(newAggregateDocument);
            }

            if (request.DomainCommand != null)
            {
                var commandDocument = _commandDocumentFactory.CreateCommand(request.DomainCommand);
                _dbContext.Commands.InsertOne(commandDocument);
            }

            foreach (var @event in request.Events)
            {
                var eventFilter = Builders <EventDocument> .Filter.Eq("aggregateId", @event.AggregateRootId.ToString());

                var currentVersion = _dbContext.Events.Find(eventFilter).CountDocuments();
                var nextVersion    = _versionService.GetNextVersion(@event.AggregateRootId, (int)currentVersion, request.DomainCommand?.ExpectedVersion);

                var eventDocument = _eventDocumentFactory.CreateEvent(@event, nextVersion);

                _dbContext.Events.InsertOne(eventDocument);
            }
        }
Example #2
0
        public async Task SaveAsync(SaveStoreData request)
        {
            var aggregateDocument = await _aggregateRepository.GetDocumentAsync(request.AggregateRootId.ToString());

            if (aggregateDocument == null)
            {
                var newAggregateDocument = _aggregateDocumentFactory.CreateAggregate(request.AggregateType, request.AggregateRootId);
                await _aggregateRepository.CreateDocumentAsync(newAggregateDocument);
            }

            if (request.DomainCommand != null)
            {
                var commandDocument = _commandDocumentFactory.CreateCommand(request.DomainCommand);
                await _commandRepository.CreateDocumentAsync(commandDocument);
            }

            foreach (var @event in request.Events)
            {
                var currentVersion = await _eventRepository.GetCountAsync(d => d.AggregateId == @event.AggregateRootId);

                var nextVersion = _versionService.GetNextVersion(@event.AggregateRootId, currentVersion, request.DomainCommand?.ExpectedVersion);

                var eventDocument = _eventDocumentFactory.CreateEvent(@event, nextVersion);

                await _eventRepository.CreateDocumentAsync(eventDocument);
            }
        }
Example #3
0
        public void Save(SaveStoreData request)
        {
            var aggregateDocument = _aggregateRepository.GetDocumentAsync(request.AggregateRootId.ToString(), request.AggregateType.AssemblyQualifiedName).GetAwaiter().GetResult();

            if (aggregateDocument == null)
            {
                var newAggregateDocument = _aggregateDocumentFactory.CreateAggregate(request.AggregateType, request.AggregateRootId);
                _aggregateRepository.CreateDocumentAsync(newAggregateDocument, request.AggregateType.AssemblyQualifiedName).GetAwaiter().GetResult();
            }

            if (request.DomainCommand != null)
            {
                var commandDocument = _commandDocumentFactory.CreateCommand(request.DomainCommand);
                _commandRepository.CreateDocumentAsync(commandDocument, request.DomainCommand.GetType().AssemblyQualifiedName).GetAwaiter().GetResult();
            }

            foreach (var @event in request.Events)
            {
                var currentVersion = _eventRepository.GetCountAsync(d => d.AggregateId == @event.AggregateRootId).GetAwaiter().GetResult();
                var nextVersion    = _versionService.GetNextVersion(@event.AggregateRootId, currentVersion, request.DomainCommand?.ExpectedVersion);

                var eventDocument = _eventDocumentFactory.CreateEvent(@event, nextVersion);

                _eventRepository.CreateDocumentAsync(eventDocument, @event.GetType().AssemblyQualifiedName).GetAwaiter().GetResult();
            }
        }
Example #4
0
        public void Save(SaveStoreData request)
        {
            using (var dbContext = _dbContextFactory.CreateDbContext())
            {
                var aggregateEntity = dbContext.Aggregates.FirstOrDefault(x => x.Id == request.AggregateRootId);
                if (aggregateEntity == null)
                {
                    var newAggregateEntity = _aggregateEntityFactory.CreateAggregate(request.AggregateType, request.AggregateRootId);
                    dbContext.Aggregates.Add(newAggregateEntity);
                }

                if (request.DomainCommand != null)
                {
                    var newCommandEntity = _commandEntityFactory.CreateCommand(request.DomainCommand);
                    dbContext.Commands.Add(newCommandEntity);
                }

                foreach (var @event in request.Events)
                {
                    var currentVersion = dbContext.Events.Count(x => x.AggregateId == @event.AggregateRootId);
                    var nextVersion    = _versionService.GetNextVersion(@event.AggregateRootId, currentVersion, request.DomainCommand?.ExpectedVersion);
                    var newEventEntity = _eventEntityFactory.CreateEvent(@event, nextVersion);
                    dbContext.Events.Add(newEventEntity);
                }

                dbContext.SaveChanges();
            }
        }
        public void SetUp()
        {
            _createSomething          = new CreateSomething();
            _createSomethingConcrete  = new CreateSomething();
            _somethingCreated         = new SomethingCreated();
            _somethingCreatedConcrete = new SomethingCreated();
            _events = new List <IEvent> {
                _somethingCreated
            };

            _createAggregate          = new CreateAggregate();
            _createAggregateConcrete  = new CreateAggregate();
            _aggregateCreatedConcrete = new AggregateCreated();
            _aggregate        = new Aggregate();
            _aggregateCreated = (AggregateCreated)_aggregate.Events[0];

            _sampleCommandSequence     = new SampleCommandSequence();
            _commandInSequenceConcrete = new CommandInSequence();

            _commandResponse = new CommandResponse {
                Events = _events, Result = "Result"
            };
            _domainCommandResponse = new CommandResponse {
                Events = _aggregate.Events, Result = "Result"
            };

            _eventPublisher = new Mock <IEventPublisher>();
            _eventPublisher
            .Setup(x => x.PublishAsync(_aggregateCreatedConcrete))
            .Returns(Task.CompletedTask);

            _storeProvider = new Mock <IStoreProvider>();
            _storeProvider
            .Setup(x => x.SaveAsync(It.IsAny <SaveStoreData>()))
            .Callback <SaveStoreData>(x => _storeDataSaved = x)
            .Returns(Task.CompletedTask);

            _objectFactory = new Mock <IObjectFactory>();
            _objectFactory
            .Setup(x => x.CreateConcreteObject(_somethingCreated))
            .Returns(_somethingCreatedConcrete);
            _objectFactory
            .Setup(x => x.CreateConcreteObject(_aggregateCreated))
            .Returns(_aggregateCreatedConcrete);
            _objectFactory
            .Setup(x => x.CreateConcreteObject(_createSomething))
            .Returns(_createSomethingConcrete);
            _objectFactory
            .Setup(x => x.CreateConcreteObject(_createAggregate))
            .Returns(_createAggregateConcrete);
            _objectFactory
            .Setup(x => x.CreateConcreteObject(It.IsAny <CommandInSequence>()))
            .Returns(_commandInSequenceConcrete);

            _validationService = new Mock <IValidationService>();
            _validationService
            .Setup(x => x.ValidateAsync(It.IsAny <CreateSomething>()))
            .Returns(Task.CompletedTask);

            _commandHandlerAsync = new Mock <ICommandHandlerAsync <CreateSomething> >();
            _commandHandlerAsync
            .Setup(x => x.HandleAsync(_createSomethingConcrete))
            .ReturnsAsync(_commandResponse);

            _domainCommandHandlerAsync = new Mock <ICommandHandlerAsync <CreateAggregate> >();
            _domainCommandHandlerAsync
            .Setup(x => x.HandleAsync(_createAggregate))
            .ReturnsAsync(_domainCommandResponse);
            _domainCommandHandlerAsync
            .Setup(x => x.HandleAsync(_createAggregateConcrete))
            .ReturnsAsync(_domainCommandResponse);

            _sequenceCommandHandlerAsync = new Mock <ISequenceCommandHandlerAsync <CommandInSequence> >();
            _sequenceCommandHandlerAsync
            .Setup(x => x.HandleAsync(It.IsAny <CommandInSequence>(), It.IsAny <CommandResponse>()))
            .ReturnsAsync(_commandResponse);

            _handlerResolver = new Mock <IHandlerResolver>();
            _handlerResolver
            .Setup(x => x.ResolveHandler <ICommandHandlerAsync <CreateSomething> >())
            .Returns(_commandHandlerAsync.Object);
            _handlerResolver
            .Setup(x => x.ResolveHandler <ICommandHandlerAsync <CreateAggregate> >())
            .Returns(_domainCommandHandlerAsync.Object);
            _handlerResolver
            .Setup(x => x.ResolveHandler <ISequenceCommandHandlerAsync <CommandInSequence> >())
            .Returns(_sequenceCommandHandlerAsync.Object);

            _mainOptionsMock = new Mock <IOptions <MainOptions> >();
            _mainOptionsMock
            .Setup(x => x.Value)
            .Returns(new MainOptions());

            _validationOptionsMock = new Mock <IOptions <ValidationOptions> >();
            _validationOptionsMock
            .Setup(x => x.Value)
            .Returns(new ValidationOptions());

            _sut = new CommandSender(_handlerResolver.Object,
                                     _eventPublisher.Object,
                                     _objectFactory.Object,
                                     _storeProvider.Object,
                                     _validationService.Object,
                                     _mainOptionsMock.Object,
                                     _validationOptionsMock.Object);
        }
Example #6
0
        public void SetUp()
        {
            _createSomething          = new CreateSomething();
            _somethingCreated         = new SomethingCreated();
            _somethingCreatedConcrete = new SomethingCreated();
            _events = new List <IEvent> {
                _somethingCreated
            };

            _createAggregate          = new CreateAggregate();
            _aggregateCreatedConcrete = new AggregateCreated();
            _aggregate        = new Aggregate();
            _aggregateCreated = (AggregateCreated)_aggregate.Events[0];

            _sampleCommandSequence = new sampleCommandSequence();

            _commandResponse = new CommandResponse {
                Events = _events, Result = "Result"
            };
            _domainCommandResponse = new CommandResponse {
                Events = _aggregate.Events, Result = "Result"
            };

            _eventPublisher = new Mock <IEventPublisher>();
            _eventPublisher
            .Setup(x => x.Publish(_aggregateCreatedConcrete));

            _storeProvider = new Mock <IStoreProvider>();
            _storeProvider
            .Setup(x => x.Save(It.IsAny <SaveStoreData>()))
            .Callback <SaveStoreData>(x => _storeDataSaved = x);

            _eventFactory = new Mock <IEventFactory>();
            _eventFactory
            .Setup(x => x.CreateConcreteEvent(_somethingCreated))
            .Returns(_somethingCreatedConcrete);
            _eventFactory
            .Setup(x => x.CreateConcreteEvent(_aggregateCreated))
            .Returns(_aggregateCreatedConcrete);

            _validationService = new Mock <IValidationService>();
            _validationService
            .Setup(x => x.Validate(_createAggregate));

            _commandHandler = new Mock <ICommandHandler <CreateSomething> >();
            _commandHandler
            .Setup(x => x.Handle(_createSomething))
            .Returns(_commandResponse);

            _domainCommandHandler = new Mock <ICommandHandler <CreateAggregate> >();
            _domainCommandHandler
            .Setup(x => x.Handle(_createAggregate))
            .Returns(_domainCommandResponse);

            _sequenceCommandHandler = new Mock <ISequenceCommandHandler <ICommand> >();
            _sequenceCommandHandler
            .Setup(x => x.Handle(It.IsAny <ICommand>(), It.IsAny <CommandResponse>()))
            .Returns(It.IsAny <CommandResponse>());

            _handlerResolver = new Mock <IHandlerResolver>();
            _handlerResolver
            .Setup(x => x.ResolveHandler(_createSomething, typeof(ICommandHandler <>)))
            .Returns(_commandHandler.Object);
            _handlerResolver
            .Setup(x => x.ResolveHandler(_createAggregate, typeof(ICommandHandler <>)))
            .Returns(_domainCommandHandler.Object);
            _handlerResolver
            .Setup(x => x.ResolveHandler(It.IsAny <ICommand>(), typeof(ISequenceCommandHandler <>)))
            .Returns(_sequenceCommandHandler.Object);

            _optionsMock = new Mock <IOptions <Options> >();
            _optionsMock
            .Setup(x => x.Value)
            .Returns(new Options());

            _sut = new CommandSender(_handlerResolver.Object,
                                     _eventPublisher.Object,
                                     _eventFactory.Object,
                                     _storeProvider.Object,
                                     _validationService.Object,
                                     _optionsMock.Object);
        }