基于事件驱动架构构建微服务第8部分:在应用程序上实现事件溯源

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part8-implementing-eventsourcing-on-application/

在本文中,我将讨论应用程序上的事件溯源实现。

该层围绕领域并实现用例(特定于应用程序的业务规则)。

它编排数据流并使用领域模型和基础架构,并且不依赖于数据库、UI或特殊框架。

出于我们的事件溯源系统的目的,我将从聚合中取出所有未提交的事件并调用仓储的函数,该函数负责将事件保存在事件存储中。所以我会调用IEventStoreRepository 的AppendAsync(EventStore @event)函数。

因为我还没有实现更新,所以我不会关心聚合版本,(我有一个创建语音的post方法,所以聚合版本将始终等于0)。当我实现更新时,我会关注应用层和表现层中的聚合版本。

事件溯源接口

我可以定义两个接口IEventSourcingSubscriber和IEventSourcingHandler,您可以使用另一种命名约定,但现在我保留它们原样。

  • Subscribe 一个函数,它从聚合中获取所有未提交的事件,并为每个事件调用一个函数Handle,该函数将事件和当前聚合版本作为输入。

Handle是将事件序列化为字符串并调用IEventStoreRepository的AppendAsync(EventStore @event)的函数。

事件溯源实现

事件资源订阅者实现

所以第一个测试应该是:没有未提交事件的订阅不应该调用Handle

我没有未完成的事件,我什么也不做。然后断言部分将如下所示:

mockEventSourcingHandler.Verify(m => m.Handle(It.IsAny<Event>(),It.IsAny<long>()), Times.Never, “Handle must not be called”);

测试用例1:没有未提交事件的订阅不应调用Handle:

到这里,我将完成我的函数的实现

测试用例2:订阅未提交的事件应该只调用一次Handle:

mockEventSourcingHandler.Verify(m => m.Handle(It.IsAny<Event>(),It.IsAny<long>()), Times.Once, “Handle must be called only once”).

在Assert部分,我可以验证Handle函数仅被调用一次。

EventSourcingSubscriber的最终实现应该是这样的:

我为每个事件调用Handle函数。

事件源处理程序实现

测试用例3:处理空事件应该引发EventNullException:

我模拟了一些依赖项并验证如果事件为空,那么Handle应该引发异常。

下面是测试的实现。

测试用例34:处理事件应调用AppendAsync:

这里我验证如果事件不为空,那么Handle应该调用AppendAsync

下面是测试的实现。您可以观察到我使用 IEventSerializer 接口将事件序列化为 json 字符串,此 json 字符串将作为事件流的有效负载。

更新REGISTERSPEECHUSECASE

然后更新RegisterSpeechUseCase并调用Subscribe函数:await _domainEventSubscriber.Subscribe(speech);

更新PRESENTATION

打开Startup.cs文件并配置一些依赖注入

打开appsettings.Development.json并更新ConnectionStrings以使用适当的数据库服务器、数据库名称和凭据。

创建数据库的脚本位于LogCorner.EduSync.Speech.Database项目中

使用POSTAMAN测试

使用VISUAL STUDIO测试本地代码

选择LogCorner.EduSync.Speech.Presentation项目并点击F5

启动postman并运行以下HTTP Post

Endpoint : http://localhost:62694/api/speechMethod : POSTContent-Type: application/jsonBody : {
“Title”:”Le Lorem Ipsum est simplement du faux texte”,
“Description”:”Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l’imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte”,
“Url”:”http://www.yahoo_1.fr”,
“Type”:”3″
}

打开Sql Server Management Studio并运行以下命令:

SELECT * FROM [LogCorner.EduSync.Speech.Data].[dbo].[Speech] SELECT * FROM [LogCorner.EduSync.Speech.Data].[dbo].[EventStore]

结果应该是这样的:

应该在Speech表和EventStore表上有记录,版本始终为零,因为本教程不包括更新。

使用Docker测试本地代码

找到\LogCorner.EduSync.Command\src文件夹(docker-compose.yml文件所在的文件夹)并运行以下命令

docker-compose build
docker-compose up
docker ps –all –format “table {{.ID}}\t{{.Image}}\t{{.Names}}”

启动postman并运行以下 HTTP Post

Endpoint : http://localhost:8080/api/speechMethod : POSTContent-Type: application/jsonBody : {
“Title”:”Le Lorem Ipsum est simplement du faux texte”,
“Description”:”Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l’imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte”,
“Url”:”http://www.yahoo_1.fr”,
“Type”:”3″
}

最后,像这样检查正在运行的容器:

通过运行以下命令打开bash shell(其中0b是logcorner.edusync.speech.presentation.data容器Id的首字母)

Docker exec -it 0b “bash”

连接到sql server linux

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘PassW0rd’

运行sql查询

use [LogCorner.EduSync.Speech.Database]
goselect * from [dbo].[Speech]
goselect * from [dbo].[eventstore]
go

应该在Speech表和EventStore表上有记录,版本始终为零,因为本教程不包括更新。

本文的源代码可在此处获得 (Feature/Task/EventSourcingApplication)

https://github.com/logcorner/LogCorner.EduSync.Speech.Command/tree/Feature/Task/EventSourcingApplication

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们来聊点成年人的话题!

1 这个话题透漏着成年人都存在的问题&#xff0c;其中心思想行走在道德底线&#xff0c;让人不得不深思&#xff0c;句句入心2 哈哈哈哈哈哈哈哈哈哈哈哈哈画面惊人 图自动漫次元酱3 对不起&#xff0c;我不是你家的鸡&#xff0c;我是一只大鸟&#xff01;&#xff01;&#x…

yum安装最新的 LNMP

2019独角兽企业重金招聘Python工程师标准>>> 先添加几个源&#xff1a; rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 1&#xff0c;安装nginx&a…

C#新版本风格项目文件(SDK风格项目 SDK-style project)

在VisualStudio中创建NetCore以上版本的项目&#xff0c;使用的都是新版本风格的项目文件。和旧版本.NetFramework版本的项目文件区别&#xff1a;双击项目可直接打开csproj文件进行编辑配置项目文件内容的改变项目属性文件夹图标更改项目引用去除&#xff0c;改成依赖项Nuget包…

史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱

全世界只有3.14 % 的人关注了爆炸吧知识世上没有精明的买家&#xff0c;只有精明的卖家。的确&#xff0c;卖家的嘴&#xff0c;骗人的鬼。在买与卖的博弈中&#xff0c;没有一个买家可以取胜。别不信&#xff0c;今天就让你见识下“卖家套路终极奥义”。按量定价&#xff0c;是…

东北大姐剪纸被误认为油画,遭人质疑二十多年,只因太过逼真,看完后:真香!不愧是天下第一剪!...

全世界只有3.14 % 的人关注了爆炸吧知识“这是剪纸&#xff1f;太惟妙惟肖了&#xff0c;我还以为是水彩画呢&#xff01;”这是一位网友的留言。茂盛的树木、潺潺的流水……这些栩栩如生的场景&#xff0c;真难想象竟是出自,一双巧手和一把剪刀。这些作品&#xff0c;全部来自…

2021 年 9 月 TIOBE 指数 C# 同比增长突破 1.2%

TIOBE 编程社区指数是编程语言流行程度的指标。该指数每月更新一次。评级基于全球熟练工程师、课程和第三方供应商的数量。谷歌、必应、雅虎、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评分。C# 近期发展状态不错&#xff0c;依旧在榜单中排第五&#xff0c;但排…

2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)

鉴于个人精力有限&#xff0c;其他答案将由51CTO相关工作人员不断更新&#xff0c;详见http://training.51cto.com/art/201005/200323.htm以题会友&#xff0c;欢迎跟贴拍砖、讨论。

那些35岁的程序员都去哪了

阅读本文大概需要11分钟。大家好&#xff0c;我是findyi&#xff0c;前段时间写过一篇关于大龄程序员的文章&#xff1a;那些40岁的程序员都去哪了&#xff0c;引发了大家的思考和讨论&#xff0c;不少读者私聊问&#xff1a;除了这些出路&#xff0c;还有没有其他可能&#xf…

Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表&#xff08;显示数据一&#xff09;中&#xff0c;解释了如何把Crystal Report整合到Sharepoint2010并把报表数据显示出来&#xff0c;但这样并不完整&#xff0c;因为我们在开发时是以系统帐户进…

那些拧不开瓶盖的女生全都是装的?理工男这样想......

全世界只有3.14 % 的人关注了爆炸吧知识昨天&#xff0c;超模君我正在思考人生&#xff0c;八岁的表妹突然提着一瓶矿泉水站在了我的面前。她可怜兮兮的说&#xff1a;“我想喝水&#xff0c;但是拧不开”。我&#xff1a;“........."超模君我明明亲眼见过她一口气拧开过…

【另类见解】秒杀并非高不可攀

“一提到秒杀很简单这个话题&#xff0c;我知道要被别人鄙视了&#xff1a;你不懂高并发... 这年头开头不画个思维导图都觉得掉价image谈到秒杀&#xff0c;网络上不少于几千片文章&#xff0c;但是大多大同小异。如果你的微信当中关注了几个编程技术类的公众号&#xff0c;我敢…

我又相信爱情了!

1 圣诞限定款的肥宅快乐水更好喝了吗&#xff1f;不&#xff01;更贵了2 周边鬼才&#xff01;这手机壳我爱了3 你以为是个王者&#xff0c;其实是个大脸......4 高温超导材料达到临界温度后能使物体悬浮在不同位置5 火山爆发你见过吗&#xff1f;6 我又相信爱情了&#xff01;…

opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

题目描述&#xff1a;给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]。其中B中的元素B[i]A[0] * A[1]... * A[i-1] * A[i1]... * A[n-1]。不能使用除法。解题思路&#xff1a;首先&#xff0c;仔细理解题意&#xff0c;B[i]是A数组所有元素的乘积&#xff0c;但是没…

记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

一&#xff1a;背景 1. 讲故事说实话&#xff0c;这篇dump我本来是不准备上一篇文章来解读的&#xff0c;但它有两点深深的感动了我。无数次的听说用 Unity 可做游戏开发&#xff0c;但百闻不如一见。游戏中有很多金庸武侠小说才有的名字&#xff0c;太赏心悦目了。000000df315…

成年人的数学公式

1 成年人的数学公式2 唯一对我说过“别走好吗”的人3 主人发起疯来有多可怕4 别人家的狗看到主人有危险▼你家的……▼5 蜘蛛捕食瞬间6 蜡烛重燃&#xff08;冒的白烟是固态小颗粒的石蜡蒸汽&#xff0c;可燃&#xff09;你点的每个赞&#xff0c;我都认真当成了喜欢

Linux运维实战之DNS的高级配置(转发器、视图等)

上次博文我们具体配置了一台DNS服务器并实现了主辅之间的区域传送&#xff0c;本次博文我们来看看DNS的一些高级配置。 在进行DNS的高级配置之前&#xff0c;必须要理解DNS的原理&#xff08;参见http://sweetpotato.blog.51cto.com/533893/1596973&#xff09; 并且对DNS的基础…

史上最烧脑的学习方法,看完瞬间涨姿势!

▲ 点击查看 在美国&#xff0c;有一个天才儿童计划&#xff0c;选拔一批“天才”儿童进入天才班。这个计划是为了保证每个人接受平等教育机会的同时&#xff0c;也为精英成长提供合适的土壤。美国所谓的天才和精英是怎样的标准呢&#xff1f;进入天才班的儿童首先要通过一个叫…

WPF轮播图实现方式(二)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览02—代码如下一、EmphasizerCarousel.cs 代码如下using System; using System.Collections.Generic; using System.Collections.Obj…

实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧&#xff0c;一开始就弄些重量级的&#xff0c;什么人工智能&#xff0c;机器学习的算法&#xff0c;还要有大量的数学以及优化的知识&#xff0c;小白们估计会很郁闷&#xff0c;当然我也不一定能做出来对…

Bootstrap在线编辑器简单分享

Bootstrap 已经使响应式网站开发变得简单很多。 但是如果你不必手动写全部代码&#xff0c;事情会如何呢&#xff1f; 如果你可以自由地选择你想要使用的Bootstrap 组件、并可以把它们拖拽到画布中&#xff0c;事情会如何呢&#xff1f;这就是Bootstrap 编辑器的用武之地。 在这…