基于事件驱动架构构建微服务第4部分:repositories
原文鏈接:https://logcorner.com/building-microservices-through-event-driven-architecture-part4-repositories/
在本文中,我將實現Repositories的命令端。存儲庫屬于Clean架構的接口適配器
在這一步中,我將開始實現基礎設施的命令端,我將專注于如何持久化數據。
我將使用EntityFrameworkCore和SQL Server。
因為LogCorner.EduSync.Speech.Application.UseCases使用ISpeechRepository作為依賴項,我認為最明顯的方法是從實現ISpeechRepository開始,然后繼續實現它的依賴項等......但既然我知道我要去哪里,我將按以下步驟進行:
UnitOfWork:我將使用UnitOfWork模式,它將幫助我將AggregateRoot視為一個用于數據更改的單元。
存儲庫:我將使用存儲庫模式,AggregateRoots是我的代碼從存儲庫加載的唯一對象 讓我們創建一個通用存儲庫IRepository并應用AggregateRoot約束。
我的IRepository如下所示:
T是一個AggregateRoot并且TIdentifier是AggregateRoot主鍵的類型:int、Guid等等……
ISpeechRepository實現了IRepository<Speech, Guid>,其中Speech是 AggregateRoot,Guid是Speech.Id的類型
無法為非AggregateRoot實體創建存儲庫:例如MediaFile
IUnitOfWork.Commit持久化(保存或更新)整個聚合(AggregateRoot和相關實體)
UNITOFWORK
讓我們從測試IUnitOfWork開始,它將導致UnitOfWork的實現。后者將需要一個從 DbContext繼承的類。(在我的情況下是 DataBaseContext)
測試1:保存時,IUnitOfWork.Commit應該保存聚合根并且DbContext.SaveChanges只調用一次
UnitOfWork的實現
讓我們創建一個繼承自DbContext的DataBaseContext類
UnitOfWork第一次測試的最終實現
實現UnitOfWork.Dispose
測試2:disposing時,unitOfWork.Dispose只調用一次
讓我們實現UnitOfWork.Dispose()
在此階段,解決方案編譯通過,所有測試均通過,LogCorner.EduSync.Speech.Infrastructure的代碼覆蓋率為100%
REPOSITORY
測試3:驗證CreateAsync可以在Repository上調用并且應該觸發dbset.AddAsync
Repository只能用AggregateRoot實例化,所以讓我們創建一個繼承自 AggregateRoot的類進行測試。
Repository的最終實現將如下所示
SPEECHREPOSITORY
測試4:驗證是否可以在SpeechRepository上調用CreateAsync并僅觸發Repository.CreateAsync一次
這個測試的目標是實現SpeechRepository,所以我驗證當SpeechRepository.CreateAsync 被調用時,Repository.CreateAsync只被調用一次
這是SpeechRepository的最終實現
MAPPING
本節的實現因使用的ORM(EF、NHibernate或其他)而異。例如,我們可以創建特定于存儲庫(SpeechDao)的類并應用SpeechDao和Speech之間的映射。SpeechDao可以看作是領域的Speech類的重復類(屬性)。
但是,EF可以通過提供IEntityTypeConfiguration接口,而無需創建存儲庫特定的類,然后在重復的類之間應用映射。
我可以使用它來將領域對象指向數據庫表,而無需在SpeechDao和Speech之間應用額外的映射,如下所示:
我們可以注意到,ValueObjects是如何管理的
您需要知道的最后一件事是EFCore需要一個無參數構造函數,因為它使用反射來完成它的工作。
如果您不想更新領域類并引入私有無參數構造函數,則應創建存儲庫特定類,然后在重復類之間應用映射。這個存儲庫特定的類應該有無參數的構造函數。
DATABASE
我使用 SSDT設計了Sql Server數據庫,這將有助于我的devops管道
CONFIGURE
配置 LogCorner.EduSync.Speech.Presentation以定位sql數據庫
最后,完成依賴注入的配置
API測試
現在可以使用postman測試整個應用程序
歡迎關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第4部分:repositories的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试官:实现一个带值变更通知能力的Dic
- 下一篇: dotnet 基于 dotnet for