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()); } }
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))); }); }