我最近与一位同事进行了讨论,他坚持认为在域驱动设计中,实体不应该有不会修改其状态的行为。根据我迄今为止的经验,我从未听说过这种限制。它是有效的DDD规则吗?
为了给出一些上下文(简化场景) - 在我们的域中我们有计算机实体,您可以在其上启动进程,我们的集成层实际上将它委托给远程物理计算机并在那里启动进程。
那么,StartProcess
应该是Computer
实体的行为吗?或者是否应该包含在域服务中,因为它不会直接影响Computer
实体的状态? (它会在进程结束后间接修改状态,并将数据同步回我们的系统)。
对我而言,实体是一个自然的地方,因为它遵循无处不在的语言,但我想知道是否有人有充分理由反对(或其他原因)。
答案 0 :(得分:2)
IMO实体行为不需要修改状态,但至少应该发出一个事件。在这种情况下,事件将类似于ProcessStarted
。 CQRS /事件源视图基本上聚合为命令处理程序 - 它们处理命令和发出事件。当行为需要或出于查询目的而非规范化时,状态变为显式。