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

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

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

            var account = Repository.GetByIdentity(domainEvents.AggregateRoot.Identity);

            Assert.IsNotNull(account);
            var ch = new SynchronizedAggregateRootCommandHandler <AccountAggregateRoot, Deposit>(Repository, new AggregateRootSynchronizer(new AggregateRootSynchronizationCache()), new AggregateRootCache());

            var tasks = new Task[10];

            for (var j = 0; j < 10; j++)
            {
                tasks[j] = ch.HandleAsync(new CommandHandlerContext(new Deposit(account.Identity, j)));
            }

            try
            {
                Task.WaitAll(tasks);
            }
            catch (Exception e)
            {
                Assert.Fail(e.ToString());
            }
        }
コード例 #2
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)));
            });
        }