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); }
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(); }
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); }
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); }
public async Task HandleAsync(ICommandContext context, ChangeTestAggregateTitleCommand command) { var testAggregate = await context.GetAsync <TestAggregate>(command.AggregateRootId); testAggregate.ChangeTitle(command.Title); }
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(); }
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); }
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; } }
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; } }