基于事件驱动架构构建微服务第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相关推荐
- 基于事件驱动架构构建微服务第1部分:应用程序特定的业务规则
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part1-applicatio ...
- 基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C
原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-a ...
- 基于事件驱动架构构建微服务第14部分:查询API
原文链接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-ap ...
- 基于事件驱动架构构建微服务第11部分:持续集成
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part12-continuou ...
- 基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part11-run-unit- ...
- 基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...
原文链接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building ...
- 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...
- 基于事件驱动架构构建微服务第15部分:SPA前端
原文链接 https://logcorner.com/building-micro-services-through-event-driven-architecture-part15-spa-fron ...
- 基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part13-read-mode ...
- 基于事件驱动架构构建微服务第12部分:向Apache KAFKA生成事件
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part12-produce-e ...
最新文章
- 苹果自动驾驶部门「裁员」又「重组」,AI负责人接掌「泰坦」
- Java_数据交换_Jackson_用法入门
- Spring的Hello, world,还有拿来主义
- 大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计
- 解决Coldfusion连接MySQL数据库的问题
- 个人作业5——软工个人总结
- html5 平移,Html5 canvas绘图旋转和平移
- 主流硬盘接口有哪些?
- Hive metastore整体代码分析及详解
- 百度地图电子围栏功能的实现
- 军用装备产品GJB150A淋雨试验检测机构
- 更换tomcat 地址栏图标
- 101个鲜为人知的超实用网站
- CSS3 文字边框 -webkit-text-stroke
- android tv github,GitHub - dongbingliu/Android-tv-widget: Android tv,盒子,投影仪 控件
- lol最克制诺手的英雄_LOL诺手怎么打如何克制诺手 什么英雄好打诺手
- 06 - table表格标签+ 行合并+列合并
- 电子取证平台需求设计文档
- 软件测试项目流程报告,周口软件测试报告流程,科技项目申报
- HelloWorld程序编写(用Java)