Esempio n. 1
0
        public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands)
        {
            var commandsToExecute = commands.OfType <ISyncInMemoryDataObjectCommand>()
                                    .Where(x => x.DataObjectType == typeof(TDataObject))
                                    .ToHashSet();

            if (commandsToExecute.Count == 0)
            {
                return(Array.Empty <IEvent>());
            }

            var events = new List <IEvent>();

            using var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.Zero });

            var changes = _changesProvider.GetChanges(commandsToExecute);

            var toDelete = changes.Complement.ToArray();

            if (toDelete.Length != 0)
            {
                events.AddRange(_dataChangesHandler.HandleRelates(toDelete));
                events.AddRange(_dataChangesHandler.HandleDeletes(toDelete));
                _bulkRepository.Delete(toDelete);
            }

            var toCreate = changes.Difference.ToArray();

            if (toCreate.Length != 0)
            {
                _bulkRepository.Create(toCreate);
                events.AddRange(_dataChangesHandler.HandleCreates(toCreate));
                events.AddRange(_dataChangesHandler.HandleRelates(toCreate));
            }

            var toUpdate = changes.Intersection.ToArray();

            if (toUpdate.Length != 0)
            {
                events.AddRange(_dataChangesHandler.HandleRelates(toUpdate));
                _bulkRepository.Update(toUpdate);
                events.AddRange(_dataChangesHandler.HandleRelates(toUpdate));
                events.AddRange(_dataChangesHandler.HandleUpdates(toUpdate));
            }

            transaction.Complete();

            return(events);
        }
Esempio n. 2
0
        public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands)
        {
            var commandsToExecute = commands.OfType <ISyncDataObjectCommand>()
                                    .Where(x => x.DataObjectType == typeof(TDataObject))
                                    .Distinct()
                                    .ToArray();

            if (!commandsToExecute.Any())
            {
                return(Array.Empty <IEvent>());
            }

            var events = new List <IEvent>();

            var changes = _changesProvider.GetChanges(commandsToExecute);

            var toDelete = changes.Complement.ToArray();

            if (toDelete.Length != 0)
            {
                events.AddRange(_dataChangesHandler.HandleRelates(toDelete));
                events.AddRange(_dataChangesHandler.HandleDeletes(toDelete));
                _bulkRepository.Delete(toDelete);
            }

            var toCreate = changes.Difference.ToArray();

            if (toCreate.Length != 0)
            {
                _bulkRepository.Create(toCreate);
                events.AddRange(_dataChangesHandler.HandleCreates(toCreate));
                events.AddRange(_dataChangesHandler.HandleRelates(toCreate));
            }

            var toUpdate = changes.Intersection.ToArray();

            if (toUpdate.Length != 0)
            {
                events.AddRange(_dataChangesHandler.HandleRelates(toUpdate));
                _bulkRepository.Update(toUpdate);
                events.AddRange(_dataChangesHandler.HandleRelates(toUpdate));
                events.AddRange(_dataChangesHandler.HandleUpdates(toUpdate));
            }

            return(events);
        }