コード例 #1
0
        public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands)
        {
            // db accessors
            var syncDataObjectCommands = commands.OfType <ISyncDataObjectCommand>().ToList();

            if (syncDataObjectCommands.Count != 0)
            {
                foreach (var accessor in CreateAccessors(_query).Select(AddTenancy))
                {
                    var specification = accessor.GetFindSpecification(syncDataObjectCommands);

                    var source = accessor.GetSource().WhereMatched(specification);
                    var target = _query.For <EntityName>()
                                 .Where(new FindSpecification <EntityName>(x => x.TenantId == _tenantProvider.Current))
                                 .WhereMatched(specification);
                    var changes = _dataChangesDetector.DetectChanges(source, target);

                    _bulkRepository.Delete(changes.Complement);
                    _bulkRepository.Create(changes.Difference);
                    _bulkRepository.Update(changes.Intersection);
                }
            }

            // memory accessors
            var syncInMemoryDataObjectCommands = commands.OfType <ISyncInMemoryDataObjectCommand>().ToList();

            if (syncInMemoryDataObjectCommands.Count != 0)
            {
                foreach (var accessor in CreateMemoryAccessors())
                {
                    var specification = accessor.GetFindSpecification(syncInMemoryDataObjectCommands);

                    var source = accessor.GetDataObjects(syncInMemoryDataObjectCommands);
                    var target = _query.For <EntityName>().WhereMatched(specification);

                    var changes = _dataChangesDetector.DetectChanges(source, target);
                    _bulkRepository.Delete(changes.Complement);
                    _bulkRepository.Create(changes.Difference);
                    _bulkRepository.Update(changes.Intersection);
                }
            }

            return(Array.Empty <IEvent>());
        }
コード例 #2
0
        public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands)
        {
            // db accessors
            var syncDataObjectCommands = commands.OfType <ISyncDataObjectCommand>().ToList();

            if (syncDataObjectCommands.Count != 0)
            {
                foreach (var accessor in CreateAccessors(_query))
                {
                    var specification = accessor.GetFindSpecification(syncDataObjectCommands);

                    var dataChangesDetector = new TwoPhaseDataChangesDetector <EntityName>(
                        spec => accessor.GetSource().WhereMatched(spec),
                        spec => _query.For <EntityName>().WhereMatched(spec),
                        _identityComparer,
                        _completeComparer);

                    var changes = dataChangesDetector.DetectChanges(specification);
                    _bulkRepository.Delete(changes.Complement);
                    _bulkRepository.Create(changes.Difference);
                    _bulkRepository.Update(changes.Intersection);
                }
            }

            // memory accessors
            var replaceDataObjectCommands = commands.OfType <IReplaceDataObjectCommand>().ToList();

            if (replaceDataObjectCommands.Count != 0)
            {
                foreach (var accessor in CreateMemoryAccessors())
                {
                    var specification = accessor.GetFindSpecification(replaceDataObjectCommands);

                    var dataChangesDetector = new TwoPhaseDataChangesDetector <EntityName>(
                        _ => accessor.GetDataObjects(replaceDataObjectCommands),
                        spec => _query.For <EntityName>().WhereMatched(spec),
                        _identityComparer,
                        _completeComparer);

                    var changes = dataChangesDetector.DetectChanges(specification);
                    _bulkRepository.Delete(changes.Complement);
                    _bulkRepository.Create(changes.Difference);
                    _bulkRepository.Update(changes.Intersection);
                }
            }

            return(Array.Empty <IEvent>());
        }