ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现 (6)

同理,我们还可以测试仓储读取聚合并恢复聚合状态的正确性,同样还是使用Moq对仓储的LoadDomainEventsAsync进行Mock:

[Fact] public async Task RetrieveBookTest() { // Arrange var fakeId = Guid.NewGuid(); var domainEventsList = new List<IDomainEvent> { new AggregateCreatedEvent(fakeId), new BookTitleChangedEvent("Hit Refresh") }; var mockRepository = new Mock<Repository>(); mockRepository.Protected().Setup<Task<IEnumerable<IDomainEvent>>>("LoadDomainEventsAsync", ItExpr.IsAny<Type>(), ItExpr.IsAny<Guid>()) .Returns(Task.FromResult(domainEventsList.AsEnumerable())); // Act var book = await mockRepository.Object.GetByIdAsync<Book>(fakeId); // Assert Assert.Equal(fakeId, book.Id); Assert.Equal("Hit Refresh", book.Title); Assert.Equal(2, book.Version); Assert.Empty(book.UncommittedEvents); }

好了,其它的几个测试用例就不多做介绍了,使用Visual Studio运行一下测试然后查看结果就可以了:

image

总结

本文又是一篇长篇幅的文章,好吧,要介绍的东西太多,而且这些内容又不能单独割开成多个主题,所以也就很难控制篇幅了。文章主要介绍了基于CQRS架构的聚合以及聚合根的设计与实现,同时引出了仓储的部分实现,这些内容也是为今后进一步讨论事件驱动型架构做准备。本文介绍的内容对于一个真实的CQRS系统实现来说还是有一定差距的,但总体结构也大致如此。文中还提及了快照的概念,这部分内容我今后在介绍事件存储的实现部分还会详细讨论,下一章打算扩展一下仓储本身,了解一下仓储对领域事件的派发,以及事件处理器对领域事件的处理。

源代码的使用

本系列文章的源代码在https://github.com/daxnet/edasample这个Github Repo里,通过不同的release tag来区分针对不同章节的源代码。本文的源代码请参考chapter_4这个tag,如下:

image

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsywf.html