domain-driven-design - 我可以说轴突命令和事件被视为贫血模型吗?
问题描述
正如主题中提到的,我在这里的问题很直接。但是,请允许我在这里简要解释一下我的天真想法。我已经使用Axon大约 10 个月了。我曾经基于Hexagonal 架构设计我的项目结构,其中有两个顶级包分别用于domain
和infrastructure
. 此外,domain
包将包含不同的域对象(如 DDD 概念中所述),例如:
Aggregate
(这将是一个Axonaggregate
类)。Repository
(在我的例子中,这将是一个Spring Data Repository接口)。Entity
(在我的情况下,这包含我用于此处所写的基于集合的一致性验证的任何查找实体)。Service Port
(收集Input
和Ouput
端口接口)。Commands
(代表轴突Command
对象)。
至于Events
,我曾经将它们放在我编译为jar
文件的不同模块上,这样我就可以将它分享给其他将在他们的项目中使用相同事件的开发人员。
我最近注意到我所有的命令和事件基本上都是贫血模型(我们应该避免的反模式)。这有什么好的做法吗?或者,它是设计故意使用的吗?
我一直在考虑将我的Command
课程放在我的课程中Aggregate
(作为内部课程)。至少通过使用这种方法,我最终不会有这么多贫血模型分散在外面。有什么想法吗 ?
解决方案
命令被设计成反映外部世界的行为和输入结构。它们不一定反映聚合的结构。
有时,它们甚至没有明确地连接到一个单一的聚合体。将它们包含在聚合中可能会产生代码异味,因为您会考虑资源和 UI 组织,而不是事务边界和实体组。
你也违反了开闭原则。用户界面和请求结构等易失层的更改将使您编辑 Aggregate 类,这不是好的设计。
在更一般的说明...
有时,贫血与非贫血(或干与非干)的争论可能会将您推向过早且不正确的优化方向。尝试避免这个陷阱,因为您最终会在代码级别进行优化,但您的域会受到影响。
DDD 和 CQRS 指南符合可帮助您长期控制复杂性的原则。保持不同和独立的事物可以帮助您实现这一目标。
推荐阅读
- sql - 带有时间戳的 SQL 内连接?
- python - 括号中数字的正则表达式匹配(文献参考)
- javascript - 从 SQL 数据库中检索数据并为现有客户填写 Web 表单上的字段
- amazon-web-services - 如何在 EMR zeppelin 上安装 boto3
- c# - 解决多个标准框架的 NuGet 包 - 可空值问题
- sql - 创建 Clickhouse 数据库并使用 R 加载大量表
- c# - 有没有办法确定 NuGet 包所针对的 .Netstandard 版本?
- c# - 使用 EF 核心中的 Entry() 方法更新数据
- django - 不能再在 Django 中删除数据库并重新应用迁移?
- php - “php lint”用于特定且稍早版本的 PHP?