为应用程序命令公开强类型 ID?

Exposing Strongly Typed Ids for Application Commands?

我在我的域模型中使用强类型 ID,主要遵循 Andrew Lock 的指导:

https://andrewlock.net/using-strongly-typed-entity-ids-to-avoid-primitive-obsession-part-1/

这些 ID,例如ProductId、CustomerId等在Domain Model中声明。

我的问题是关于将这些暴露给应用层的消费者。目前,API 控制器可以创建一个命令发送到应用层。这些命令还需要使用 ID。我当前在 Command 对象中的实现是使用原始类型 Guid,然后在调用域模型上的方法时创建强类型 ID。

但是,将使用强类型 ID 提供的控制扩展到 API 控制器和应用层之间的通信是有意义的。但是,我不希望我的 API 控制器引用域模型(这是目前声明强类型 ID 的地方)。

怎么办?

  1. 从应用层声明一组类似的强类型 ID。但这仍然需要在调用域中的方法之前在应用程序声明和域模型声明之间进行转换。

  2. 将 ID 的声明移动到 'public' 模块中,API 和领域模型都可以引用。但这将意味着域模型依赖关系泄漏到 API 控制器依赖关系,并且我的域模型方法中的任何更改都可能影响 API 控制器,这是不可取的。

这个问题看起来很合理,但以上两种解决方案都不是最优的。有什么想法吗?

阅读了 Vaughn Vernon 的书“实施领域驱动设计”:

https://www.amazon.co.uk/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577/ref=asc_df_0321834577/

我已经听从了第580页的建议,基本上是“务实”。

具体来说,

对于 ID 和我认为漂亮的任何其他值对象 'fixed' 我选择使用 API、应用程序和域层可以使用的共享内核(即我的问题中的选项 2) .

对于其他可能更复杂的值对象,这些对象可能包含特定于域的额外业务逻辑,并且在响应业务变化时可能更不稳定,那么我使用问题中的选项 1 并创建精简的 ( DTO) 版本,用于从应用程序公开并执行从这些版本到域模型版本的映射。