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

原文链接: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“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值