public void create_and_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            commandResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
Exemple #2
0
        public void create_and_concurrent_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //并发执行修改聚合根的命令
            var totalCount    = 100;
            var finishedCount = 0;
            var waitHandle    = new ManualResetEvent(false);

            for (var i = 0; i < totalCount; i++)
            {
                var updateCommand = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Changed Note"
                };
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    var result = t.Result;
                    Assert.IsNotNull(result);
                    Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                    Assert.IsNotNull(result.Data);
                    Assert.AreEqual(CommandStatus.Success, result.Data.Status);

                    var current = Interlocked.Increment(ref finishedCount);
                    if (current == totalCount)
                    {
                        note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
                        Assert.IsNotNull(note);
                        Assert.AreEqual("Changed Note", note.Title);
                        Assert.AreEqual(totalCount + 1, ((IAggregateRoot)note).Version);
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
        }
Exemple #3
0
        public void duplicate_update_aggregate_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command1    = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //先创建一个聚合根
            var status = _commandService.ExecuteAsync(command1).Result.Data.Status;

            Assert.AreEqual(CommandStatus.Success, status);

            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            //执行修改聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);

            //在重复执行该命令
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
        public async Task command_sync_execute_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId   = aggregateId,
                Title             = "Sample Note",
                SleepMilliseconds = 3000
            };

            //执行创建聚合根的命令
            var commandResult = await _commandService.ExecuteAsync(command);

            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Success, commandResult.Status);
            var note = await _memoryCache.GetAsync <TestAggregate>(aggregateId);

            Assert.NotNull(note);
            Assert.Equal("Sample Note", note.Title);
            Assert.Equal(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            commandResult = await _commandService.ExecuteAsync(command2);

            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Success, commandResult.Status);
            note = await _memoryCache.GetAsync <TestAggregate>(aggregateId);

            Assert.NotNull(note);
            Assert.Equal("Changed Note", note.Title);
            Assert.Equal(2, ((IAggregateRoot)note).Version);
        }
Exemple #5
0
        public void create_and_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title = "Changed Note"
            };
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
Exemple #6
0
        public async Task HandleAsync(ICommandContext context, ChangeTestAggregateTitleCommand command)
        {
            var testAggregate = await context.GetAsync <TestAggregate>(command.AggregateRootId);

            testAggregate.ChangeTitle(command.Title);
        }
Exemple #7
0
        public void create_and_concurrent_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //并发执行修改聚合根的命令
            var totalCount = 100;
            var finishedCount = 0;
            var waitHandle = new ManualResetEvent(false);
            for (var i = 0; i < totalCount; i++)
            {
                var updateCommand = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Changed Note"
                };
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    var result = t.Result;
                    Assert.IsNotNull(result);
                    Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                    Assert.IsNotNull(result.Data);
                    Assert.AreEqual(CommandStatus.Success, result.Data.Status);

                    var current = Interlocked.Increment(ref finishedCount);
                    if (current == totalCount)
                    {
                        note = _memoryCache.Get<TestAggregate>(aggregateId);
                        Assert.IsNotNull(note);
                        Assert.AreEqual("Changed Note", note.Title);
                        Assert.AreEqual(totalCount + 1, ((IAggregateRoot)note).Version);
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
        }
Exemple #8
0
        public void duplicate_update_aggregate_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command1 = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //先创建一个聚合根
            var status = _commandService.ExecuteAsync(command1).Result.Data.Status;
            Assert.AreEqual(CommandStatus.Success, status);

            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title = "Changed Note"
            };

            //执行修改聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);

            //在重复执行该命令
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
 public void Handle(ICommandContext context, ChangeTestAggregateTitleCommand command)
 {
     context.Get <TestAggregate>(command.AggregateRootId).ChangeTitle(command.Title);
 }
Exemple #10
0
        public void update_concurrent_conflict_not_enable_batch_insert_test()
        {
            _eventStore.SupportBatchAppendEvent = false;

            try
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var command = new CreateTestAggregateCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Sample Note"
                };

                //执行创建聚合根的命令
                var asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                var commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                var note = _memoryCache.Get<TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual("Sample Note", note.Title);
                Assert.AreEqual(1, ((IAggregateRoot)note).Version);

                //往EventStore直接插入事件,用于模拟并发冲突的情况
                var eventStream = new DomainEventStream(
                    ObjectId.GenerateNewStringId(),
                    aggregateId,
                    typeof(TestAggregate).FullName,
                    2,
                    DateTime.Now,
                    new IDomainEvent[] { new TestAggregateTitleChanged("Changed Title") { AggregateRootId = aggregateId, Version = 2 } },
                    null);
                var result = _eventStore.AppendAsync(eventStream).Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                Assert.AreEqual(EventAppendResult.Success, result.Data);

                var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 2).Result;
                Assert.IsNotNull(result2);
                Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

                //执行修改聚合根的命令
                var command2 = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Changed Note2"
                };
                asyncResult = _commandService.ExecuteAsync(command2).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                note = _memoryCache.Get<TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual(3, ((IAggregateRoot)note).Version);
                Assert.AreEqual("Changed Note2", note.Title);
            }
            finally
            {
                _eventStore.SupportBatchAppendEvent = true;
            }
        }
Exemple #11
0
        public void update_concurrent_conflict_not_enable_batch_insert_test()
        {
            _eventStore.SupportBatchAppendEvent = false;

            try
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var command     = new CreateTestAggregateCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Sample Note"
                };

                //执行创建聚合根的命令
                var asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                var commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                var note = _memoryCache.Get <TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual("Sample Note", note.Title);
                Assert.AreEqual(1, ((IAggregateRoot)note).Version);

                //往EventStore直接插入事件,用于模拟并发冲突的情况
                var eventStream = new DomainEventStream(
                    ObjectId.GenerateNewStringId(),
                    aggregateId,
                    typeof(TestAggregate).FullName,
                    2,
                    DateTime.Now,
                    new IDomainEvent[] { new TestAggregateTitleChanged("Changed Title")
                                         {
                                             AggregateRootId = aggregateId, Version = 2
                                         } },
                    null);
                var result = _eventStore.AppendAsync(eventStream).Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                Assert.AreEqual(EventAppendResult.Success, result.Data);

                var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 2).Result;
                Assert.IsNotNull(result2);
                Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

                //执行修改聚合根的命令
                var command2 = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Changed Note2"
                };
                asyncResult = _commandService.ExecuteAsync(command2).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                note = _memoryCache.Get <TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual(3, ((IAggregateRoot)note).Version);
                Assert.AreEqual("Changed Note2", note.Title);
            }
            finally
            {
                _eventStore.SupportBatchAppendEvent = true;
            }
        }