当前位置: 首页 > news >正文

网站建设视频百度云php网站 config

网站建设视频百度云,php网站 config,中文网站排行榜,那里做网站比较好原文链接#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part10-handling-updates-and-deletes/在本文中#xff0c;我将讨论如何处理事件溯源系统上的更新。在前面的步骤中#xff0c;我将系统的所有业务变化存储为事件… 原文链接https://logcorner.com/building-microservices-through-event-driven-architecture-part10-handling-updates-and-deletes/在本文中我将讨论如何处理事件溯源系统上的更新。在前面的步骤中我将系统的所有业务变化存储为事件而不是存储当前状态。我通过将所有事件应用于聚合来重建当前状态。我已经建立了一个领域事件列表过去发生的业务变化以通用语言表达例如ThePackageHasBeenDeliveredToCustomer。领域事件是不可变的当事件发生时它不能改变。因此要纠正事件中的错误我必须创建一个具有正确值的补偿事件例如银行帐户交易。聚合记录已提交的事件并保护业务不变量。这是事务边界。为了处理并发我将使用带有版本控制的乐观并发控制 (OCC)。在不获取锁的情况下每个事务都会验证没有其他事务修改了它所读取的数据。如果数据没有改变则提交事务如果数据被其他人改变则事务回滚并可以重新启动。使用版本控制用户读取聚合的当前状态然后发送带有版本号的命令如果版本号与聚合的当前版本匹配则提交事务。如果版本号与聚合的当前版本不匹配在这种情况下这意味着数据已被其他人更新。所以用户应该再次读取数据以获得正确的版本并重试。在本教程中我将展示如何更新语音实体。它具有以下属性标题、描述、网址和类型。所以每个属性的更新都是一个事件应该存储在事件存储中。处理领域模型的更新处理更新标题测试用例1当title为null或为空时ChangeTitle应引发ArgumentNullAggregateException在这里我将测试如果Title为NullOrEmpty则系统应该引发异常。测试用例2当预期版本不等于聚合版本时的ChangeTitle应该引发ConcurrencyException在这里我将测试如果预期版本不等于聚合版本则系统应该引发异常。因为我创建了一个新语音聚合版本等于0所以如果我将expectedVersion设置为1测试应该会引发异常。测试用例3具有有效参数的ChangeTitle应应用SpeechTitleChangedEvent在这里我将测试如果没有错误则应将newTitle应用于演讲的标题。换句话说Speech.Title “更新后新标题的值”由于Apply函数将事件应用于聚合因此语音的标题应等于SpeechTitleChangedEvent值的标题。ChangeTitle最终实现ChangeTitle的最终实现应该是这样的。很简单我的标题不为空或为空应用SpeechTitleChangedEvent。apply函数使用事件SpeechTitleChangedEvent的值设置演讲标题。检查聚合版本的代码是在前面的步骤中开发的参见aggregateroot.cs类public void ValidateVersion(long expectedVersion) { if (Version ! expectedVersion) { throw new ConcurrencyException($”Invalid version specified : expectedVersion  {Version}  but originalVersion    {expectedVersion}.”); } }处理更新DESCRIPTION、URL和TYPEChangeDescription、ChangeUrl和ChangeType应遵循与ChangeTitle相同的场景处理申请更新处理更新标题测试用例1当Command为空时处理更新应该引发ApplicationArgumentNullException 在这里我将测试如果updateCommand为空那么系统应该引发异常。所以我应该模拟所有外部依赖项IUnitOfWork、ISpeechRepository和IEventSourcingSubscriber我将提供一个空命令并验证是否引发了ApplicationArgumentNullException。测试用例2当语音不存在时处理更新应该引发ApplicationNotFoundException这里我将测试如果要更新的语音不存在那么系统应该引发异常ApplicationNotFoundException。我必须安排我的存储库以便它返回带有模拟的空语音moqEventStoreRepository.Setup(m  m.GetByIdAsyncDomain.SpeechAggregate.Speech(command.SpeechId)) .Returns(Task.FromResult((Domain.SpeechAggregate.Speech)null));就像这样。测试用例3当命令不为空时处理更新应更新语音标题这里我测试一下如果命令不为空并且数据库中存在要更新的语音则应该更新标题。验证语音标题是否被修改的一种方法是在将其发送到存储库之前检查它的值它应该等于新标题的值moqSpeechRepository.Verify(m  m.UpdateAsync(It.IsDomain.SpeechAggregate.Speech(n  n.Title.Value.Equals(command.Title) )),Times.Once);测试用例4当预期版本不等于聚合版本时处理更新应该引发ConcurrencyException在这里我将测试如果预期版本不等于聚合版本那么系统应该引发异常。聚合等于零因为我实例化了一个新的语音然后如果expectedversion不等于零则系统应该引发ConcurrencyException。处理仓储更新处理更新测试用例1当Speech为空时处理更新应该引发RepositoryArgumentNullException 测试用例2当语音不存在时处理更新应该引发NotFoundRepositoryException测试用例3当语音有效且存在时处理更新应执行更新以及最终的实现处理PRESENTATION的更新处理更新测试用例1当ModelState无效时更新语音应返回BadRequest测试用例2发生异常时的UpdateSpeech应引发InternalServerError同上注册语音ExceptionMiddleware测试用例3当ModelState有效且没有错误时更新语音应该返回Ok以及最终的实现用POSTMAN测试按F5并启动postman和sql server。让我们启动sql server看看发生了什么 让我们运行一个select查询你可以看到[dbo].[Speech]和[dbo].[EventStore]这两个表是空的。让我们启动postman并运行一个post请求来创建一个演讲http://localhost:62694/api/speechpostman脚本在这里LogCorner.EduSync.Command\src\Postman\BLOG.postman_collection.json现在我应该有一个新创建的演讲和一个事件LogCorner.EduSync.Speech.Domain.Events.SpeechCreatedEvent, LogCorner.EduSync.Speech.Domain, Version1.0.0.0, Cultureneutral, PublicKeyTokennull 请注意版本等于 0。对于每个新语音版本应为零。如果我检查有效载荷我必须看到我的事件{ “Title”: { “Value”: “Le Lorem Ipsum est simplement du faux texte” }, “Url”: { “Value”: “http://www.yahoo_1.fr” }, “Description”: { “Value”: “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” }, “Type”: { “Value”: 3 }, “AggregateId”: “7c8ea8a0-1900-4616-9739-7cb008d37f74”, “EventId”: “a688cc8a-ed56-4662-bbad-81e66ed917a0”, “AggregateVersion”: 0, “OcurrendOn”: “2020-01-19T15:49:59.3913833Z” }为了更新演讲的标题我运行以下请求 http://localhost:62694/api/speech 这是一个PUT请求。我拿到了新建语音的标识符CF17D255-9991-4B7B-B08E-F65B54AA9335 让我们从sql复制并将其粘贴到请求正文中。好的现在我可以运行put查询回到sql server验证结果SELECT * FROM [dbo].[Speech]SELECT * FROM [dbo].[EventStore]我应该看到更新的标题和一个新事件LogCorner.EduSync.Speech.Domain.Events.SpeechTitleChangedEvent。版本应为 1有效负载应为更新事件{ “Title”: “UPDATE_1__Le Lorem Ipsum est simplement du faux texte”, “AggregateId”: “7c8ea8a0-1900-4616-9739-7cb008d37f74”, “EventId”: “de253f69-ea89-4a54-8927-e09553cc43c7”, “AggregateVersion”: 1, “OcurrendOn”: “2020-01-19T15:55:14.1734365Z” }本文的源代码可在此处获得 (Feature/Task/EventSourcingApplication)https://github.com/logcorner/LogCorner.EduSync.Speech.Command/tree/Feature/EventSourcingHandlingUpdates
http://www.zqtcl.cn/news/742892/

相关文章:

  • 网站建设自评报告手机电商平台怎么做的
  • 安阳网站建设优化免费的免抠图素材网站
  • 网站主机有什么用seo网站课程
  • 网站关键词优化软件网站的二次开发
  • 网站建设技术服务费怎么入账杭州网站推广与优化
  • 咨询类网站建设方案书重庆360网络推广
  • 简单网站模板下载wordpress调用数据库字段
  • 万网空间最多放几个网站好的网站首页的特点
  • .net做网站安全吗wordpress取消邮件验证
  • 沈阳做网站推广唐山网站怎么做seo
  • 网站备案说主体已注销刷关键词指数
  • 学做网站教学百度网盘动软代码生成器 做网站
  • 长辛店网站建设手机评测网站
  • 网站建设公司选哪个好软件开发
  • 隐形眼镜网站开发的经济效益莘县网站开发
  • 开创集团网站建设如何在学校网站上做链接
  • 上海优秀网站设计百度投诉中心人工电话号码
  • 卖建材的网站有哪些跨境电商工具类产品的网站
  • 做毕业网站的周记网站开发项目书
  • 门户网站价格仿站工具下载后咋做网站
  • 国外优秀ui设计网站常州网站建设电话
  • 大连手机网站建设做外贸无网站如何做
  • 做旅游门票网站需要什么材料人工智能培训机构哪个好
  • 免费的网站程序个人网站可以做论坛么
  • ps中网站页面做多大的wordpress cdn 阿里
  • 深圳整站创意设计方法有哪些
  • 浙江做网站多少钱江门市网站开发
  • 保定建站价格dw软件免费安装
  • 在建设部网站上的举报凡科网怎么建网站
  • wordpress做小说网站工作期间员工花钱做的网站