コード例 #1
0
        public virtual void CanAddMultipleDomainEventsToSingleEventProviderConcurrently()
        {
            var accountId    = SequentialAtEndGuidGenerator.NewGuid();
            var command      = new Create(accountId, 100);
            var domainEvents = AccountAggregateRoot.Create(command);

            domainEvents.AggregateRoot.State.ExternalStateTracker = GetStateTracker(domainEvents);

            Repository.Commit(new CommandHandlerContext(command), domainEvents.AggregateRoot as AccountAggregateRoot);

            var synchronizer       = new AggregateRootSynchronizer(new AggregateRootSynchronizationCache());
            var aggregateRootCache = new AggregateRootCache();

            var ch  = new SynchronizedAggregateRootCommandHandler <AccountAggregateRoot, Deposit>(Repository, synchronizer, aggregateRootCache);
            var ch1 = new SynchronizedAggregateRootCommandHandler <AccountAggregateRoot, Withdraw2>(Repository, synchronizer, aggregateRootCache);

            var random = new Random();

            Parallel.For(0, 20, (i) =>
            {
                ch.Handle(new CommandHandlerContext(new Deposit(accountId, i)));
                ch1.Handle(new CommandHandlerContext(new Withdraw2(accountId, random.Next(1, 10) * i)));
            });
        }