原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part3-presenters-views-and-controllers/

在本文中,我将实现Presentation(展示层)。这里的展示层不是指用户界面而是Web API。

也可以在实现展示层之前先实现repository,顺序无所谓。

IUnitOfWork和ISpeechRepository将被注入到RegisterSpeechUseCase中。因此,必须实例化IUnitOfWork和ISpeechRepository才能获得IRegisterSpeechUseCase的实例

类似这样

但是,由于我正在模拟IRegisterSpeechUseCase,因此我仍然不需要IUnitOfWork和 ISpeechRepository的具体实现。

因此,当repository实现并准备好使用时,我再配置依赖项注入。当一个团队正在处理Presentation而另一个团队正在处理repository时,这很有用。在这种情况下,每个团队都可以持续推进自己的工作,而无需等待其他团队。

Presentation属于Clean架构中的接口适配器

接口适配器

在这里,我必须创建一个接受dto的HttpPost操作,其中包含有关我要创建的语音的信息。如果这个信息是正确的,我会调用用例的handle函数,并将dto转换为command作为参数传递。如果dto的信息不正确,我将返回BadRequest或400 然后执行用例,如果一切正常,我返回200,否则返回500

所以我的第一个测试将是:使用无效的ModelState注册语音返回BadRequest

所以让我们创建它

下一步是创建SpeechForCreationDto类和SpeechController类:

SpeechForCreationDto

SpeechController

然后我的第一个测试通过

我的第二个测试将验证_registerSpeechUseCase.Handle(command)只调用一次并返回OK

所以,为了让之前的测试通过,我必须像这样调用_registerSpeechUseCase.Handle

最后一个测试是在发生异常时处理InternalServerError(500)

我更喜欢创建一个中间件以便在全局范围内捕获错误,如果抛出异常,我将按以下步骤进行:

  • 记录StackTrace,logger.LogError($”出现问题:{ex.StackTrace}”);

  • 返回内部服务器错误,StatusCode = 500

我在整个应用程序中使用了一个try/catch块。通过执行以下操作,也可以不使用try/catch块:

Presentation的代码覆盖率为63%:

未测试的是Startup类和Program类以及ExceptionMiddleware.MoveNext()函数

我可以添加更多测试来覆盖它们,但我也可以保留它们,因为它们将被集成测试覆盖

欢迎关注我的个人公众号”My IO“

基于事件驱动架构构建微服务第3部分:Presenters, Views和Controllers相关推荐

  1. 基于事件驱动架构构建微服务第1部分:应用程序特定的业务规则

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part1-applicatio ...

  2. 基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C

    原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-a ...

  3. 基于事件驱动架构构建微服务第14部分:查询API

    原文链接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-ap ...

  4. 基于事件驱动架构构建微服务第11部分:持续集成

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part12-continuou ...

  5. 基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part11-run-unit- ...

  6. 基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...

    原文链接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building ...

  7. 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...

  8. 基于事件驱动架构构建微服务第15部分:SPA前端

    原文链接 https://logcorner.com/building-micro-services-through-event-driven-architecture-part15-spa-fron ...

  9. 基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part13-read-mode ...

  10. 基于事件驱动架构构建微服务第12部分:向Apache KAFKA生成事件

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part12-produce-e ...

最新文章

  1. 【2021年度训练联盟热身训练赛第二场】Soccer Standings(python)
  2. python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)
  3. 玩转算法之面试 第八章-递归与回溯
  4. 接口和抽象类的区别?
  5. HTML:让img标签和input标签水平对齐一样高
  6. 存用部首查字典如何查_SCI文献阅读技巧:3位博士总结如何看文献,干货满满!...
  7. 【图像分割】基于matlab粒子群优化T熵图像分割【含Matlab源码 286期】
  8. genymotion-安卓模拟器-IMEI修改方法
  9. 使用python修改微信支付宝运动步数
  10. PART 3.3 风控建模卡方分箱计算篇
  11. Buffer() is deprecated due to security and usability issues.webpack 报错
  12. 004.麻雀虽小五脏俱全--最简单的JavaWeb
  13. 鹏哥C语言红皮书(14-19)
  14. 腾达a9服务器无响应,腾达(Tenda)A9设置网站打不开怎么办?
  15. Android USB 主机模式
  16. potato社交苹果版下载-potato土豆社交ios下载
  17. 高阳墙绘 墙体彩绘 手绘壁画赏析
  18. 数据分析基础 - 统计学
  19. android 评论功能盖楼,微信公众号留言功能升级,评论区能“盖楼”了
  20. YBT高效进阶 6.2.5 余数之和

热门文章

  1. IntelliJ IDEA代码分屏显示
  2. 关于内存的划分和传引用传参数的区别
  3. mysql中的增删改查
  4. 【BZOJ-2299】向量 裴蜀定理 + 最大公约数
  5. centos6.4下安装jdk
  6. AMD and CMD are dead之KMD.js依赖可视化工具发布
  7. 轻松搭建Google ADK开发环境
  8. LUA面向对象编程技巧
  9. 用回溯法找出n个自然数中取r个数的全排列
  10. jq select操作全集