我在域模型中使用强类型 ID,主要遵循 Andrew Lock 的指导:
https://andrewlock.net/using-strongly-typed-entity-ids-to-avoid-primitive-obsession-part-1/
这些 ID,例如ProductId、CustomerId 等在域模型中声明。
我的问题是将这些暴露给应用程序层的消费者。目前,API Controller 可以创建一个命令发送到应用程序层。这些命令也需要使用 Id。我当前在 Command 对象中的实现是使用原始类型 Guid,然后在调用域模型上的方法时创建强类型 Id。
但是,将使用强类型 ID 提供的控制扩展到 API Controller 和应用程序层之间的通信是有意义的。但是,我不希望我的 API Controller 引用域模型(这是目前声明强类型 ID 的地方)。
如何解决这个问题?
从应用程序层声明一组类似的强类型 ID。但是在调用域中的方法之前,仍然需要在应用程序声明和域模型声明之间进行转换。
将 Id 声明移至 API 和域模型都可以引用的“公共(public)”模块中。但这意味着域模型依赖项会泄漏到 API Controller 依赖项,并且我的域模型方法中的任何更改都可能会影响 API Controller ,这是不可取的。
这个要求似乎很合理,但上述解决方案都不是最佳的。有什么想法吗?
最佳答案
回顾了 Vaughn Vernon 的书“实现领域驱动设计”:
我遵循了第580页的建议,基本上是“务实”。
具体来说,
对于 Id 和任何其他我认为相当“固定”的值对象,我选择使用 API、应用程序和域层可以使用的共享内核(即我的问题中的选项 2)。
对于其他可能更复杂的值对象,这些对象可能包含特定于域的附加业务逻辑,并且在响应业务变化时可能更加不稳定,那么我将使用我的问题中的选项 1 并创建一个精简版 (DTO)用于从应用程序公开并执行从这些版本到域模型版本的映射的版本。
关于asp.net-core - 暴露应用程序命令的强类型 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69426274/