其他分享
首页 > 其他分享> > CodeGo.net>如何查询除ID以外的其他属性聚合根?

CodeGo.net>如何查询除ID以外的其他属性聚合根?

作者:互联网

为了澄清起见:BuckupableThing是其中写入了程序的某些硬件设备(已备份).

更新的说明:这个问题更多的是关于CQRS / ES的实现,而不是DDD建模.

假设我有3个聚合根:

class BackupableThing
{
    Guid Id { get; }
}

class Project
{
    Guid Id { get; }

    string Description { get; }
    byte[] Data { get; }
}

class Backup
{
    Guid Id { get; }

    Guid ThingId { get; }
    Guid ProjectId { get; }
    DateTime PerformedAt { get; }
}

每当我需要备份BackupableThing时,都需要先创建一个新的Project,然后再创建一个新的Backup,并将ProjectId设置为此新Project的ID.只要每个新备份都有一个新项目,一切都会正常进行.

但是实际上我需要创建一个项目(如果只有该项目不存在的话),现有项目的唯一ID应该是它的Data属性(某种形式的byte []哈希数组).因此,当备份了任何其他BackupableThing时,系统看到已经备份了另一个BackupableThing,并且备份了相同的结果(数据)-显示已创建且正在运行的项目,其中包含所有描述和所有设置.

首先,我想到了以某种方式在Guid中对哈希进行编码来解决此问题,但这似乎很棘手,而且不简单,而且还增加了与随机生成的Guid发生冲突的机会.

然后,我想到了单独的表(带有单独的存储库)的想法,该表包含两列:数据散列(某些int / long)和PlcProjectId(Guid).但这看起来非常像投影,并且实际上是一种投影,因此我可以使用事件存储中的域事件在理论上重建它.我读到从域服务/聚合/存储库(从写端)查询读取侧是不好的,而且一段时间后我无法提出其他建议.

更新资料

因此,基本上,我在仅域有权访问的域内创建了读取侧.并且我在添加新项目之前对其进行查询,以便如果它已经存在,那么我将使用已经存在的项目?是的,我已经整夜想起它了,似乎不仅我必须进行这样的域存储并在创建新的聚合之前对其进行查询,而且还必须引入一些补偿措施.例如,如果发送了多个请求以同时创建同一项目,则将创建两个相同的项目.因此,我需要将域存储用作事件处理程序,并且如果用户创建了相同的项目,则需要触发补偿命令以使用现有项目删除/移动/重新创建该项目…

更新2

我也正在考虑为此目的创建另一个聚合-用于项目唯一性范围的聚合(在此特定方案中-GlobalScopeAggregate或DomainAggregate),它将保存{name,Guid}键值引用.单独的GlobalScopeHandler将负责ProjectCreated,ProjectArchived,ProjectRenamed事件,并且如果ProjectCreated事件与已经创建的同名事件发生,则最终将触发补偿操作.但是我对补偿行动感到困惑.如果用户已经进行了备份并且在他的界面中具有与该项目相关的视图,我该怎么办?他可以更改错误项目的描述,名称等,该错误项目已经通过补偿措施删除.另外,我的补偿操作将删除Project和Backup聚合,并使用现有ProjectId创建新的Backup聚合,因为我的Backup聚合在ProjectId字段上没有设置方法(这是备份执行操作的不可变记录).这正常吗?

更新3-DOMAIN澄清

宽带网络上有许多工业设备(BackupableThing,可编程控制器),其中已编程了一些固件.客户更新固件并将其上传到控制器中(可备份的东西).此程序将被备份.但是有许多相同类型的控制器,客户很有可能会一遍又一遍地将同一程序上载到多个控制器以及同一控制器(作为撤消某些更改的一种手段).用户需要重复备份所有这些控制器.备份是一些二进制数据(存储在控制器,程序中)和备份发生的日期.项目是封装二进制数据以及所有与备份有关的信息的实体.鉴于我无法以以前上传的状态备份程序(我只能获取无法读取的原始二进制数据,也可以再次上传回控制器),因此我需要单独的聚合项目,该项目应具有Data属性以及附加的数量文件(例如,固件项目文件),描述,名称和其他字段.现在,无论何时备份某些控制器,我都不想显示“只是二进制数据而没有任何描述”,而是强迫用户再次填写所有描述字段.我想查看是否已经使用相同的二进制数据完成了备份,然后只需将此项目链接到该备份,以便备份另一个控制器的用户将立即看到很多有关此控制器中内容的信息.

标签:domain-driven-design,cqrs,c,net,event-sourcing
来源: https://codeday.me/bug/20191112/2023976.html