基于事件驱动架构构建微服务第3部分:Presenters, Views和Controllers
原文鏈接:https://logcorner.com/building-microservices-through-event-driven-architecture-part3-presenters-views-and-controllers/
在本文中,我將實現(xiàn)Presentation(展示層)。這里的展示層不是指用戶界面而是Web API。
也可以在實現(xiàn)展示層之前先實現(xiàn)repository,順序無所謂。
IUnitOfWork和ISpeechRepository將被注入到RegisterSpeechUseCase中。因此,必須實例化IUnitOfWork和ISpeechRepository才能獲得IRegisterSpeechUseCase的實例
類似這樣
但是,由于我正在模擬IRegisterSpeechUseCase,因此我仍然不需要IUnitOfWork和 ISpeechRepository的具體實現(xiàn)。
因此,當repository實現(xiàn)并準備好使用時,我再配置依賴項注入。當一個團隊正在處理Presentation而另一個團隊正在處理repository時,這很有用。在這種情況下,每個團隊都可以持續(xù)推進自己的工作,而無需等待其他團隊。
Presentation屬于Clean架構(gòu)中的接口適配器
接口適配器
在這里,我必須創(chuàng)建一個接受dto的HttpPost操作,其中包含有關(guān)我要創(chuàng)建的語音的信息。如果這個信息是正確的,我會調(diào)用用例的handle函數(shù),并將dto轉(zhuǎn)換為command作為參數(shù)傳遞。如果dto的信息不正確,我將返回BadRequest或400 然后執(zhí)行用例,如果一切正常,我返回200,否則返回500
所以我的第一個測試將是:使用無效的ModelState注冊語音返回BadRequest
所以讓我們創(chuàng)建它
下一步是創(chuàng)建SpeechForCreationDto類和SpeechController類:
SpeechForCreationDto
SpeechController
然后我的第一個測試通過
我的第二個測試將驗證_registerSpeechUseCase.Handle(command)只調(diào)用一次并返回OK
所以,為了讓之前的測試通過,我必須像這樣調(diào)用_registerSpeechUseCase.Handle
最后一個測試是在發(fā)生異常時處理InternalServerError(500)
我更喜歡創(chuàng)建一個中間件以便在全局范圍內(nèi)捕獲錯誤,如果拋出異常,我將按以下步驟進行:
記錄StackTrace,logger.LogError($”出現(xiàn)問題:{ex.StackTrace}”);
返回內(nèi)部服務(wù)器錯誤,StatusCode = 500
我在整個應(yīng)用程序中使用了一個try/catch塊。通過執(zhí)行以下操作,也可以不使用try/catch塊:
Presentation的代碼覆蓋率為63%:
未測試的是Startup類和Program類以及ExceptionMiddleware.MoveNext()函數(shù)
我可以添加更多測試來覆蓋它們,但我也可以保留它們,因為它們將被集成測試覆蓋
歡迎關(guān)注我的個人公眾號”My IO“
總結(jié)
以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第3部分:Presenters, Views和Controllers的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NET问答: 如何集中化统一验证 Aut
- 下一篇: Magicodes.IE之快速导出Exc