asp.net-core - 暴露应用程序命令的强类型 ID?

标签 asp.net-core asp.net-web-api domain-driven-design strong-typing

我在域模型中使用强类型 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 的地方)。

如何解决这个问题?

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

  2. 将 Id 声明移至 API 和域模型都可以引用的“公共(public)”模块中。但这意味着域模型依赖项会泄漏到 API Controller 依赖项,并且我的域模型方法中的任何更改都可能会影响 API Controller ,这是不可取的。

这个要求似乎很合理,但上述解决方案都不是最佳的。有什么想法吗?

最佳答案

回顾了 Vaughn Vernon 的书“实现领域驱动设计”:

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

我遵循了第580页的建议,基本上是“务实”。

具体来说,

对于 Id 和任何其他我认为相当“固定”的值对象,我选择使用 API、应用程序和域层可以使用的共享内核(即我的问题中的选项 2)。

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

关于asp.net-core - 暴露应用程序命令的强类型 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69426274/

相关文章:

c# - 如何在请求结束时释放资源并在 ASP.NET 5/Core 中处理注入(inject)的服务?

javascript - 单击链接时更改变量

rest - 如何为非资源实体设计REST API

domain-driven-design - 在 DDD 系统中查询

architecture - 在哪里放置需要从数据库中获取数据的域逻辑

Javascript 对象作为空对象 "Uncaught ReferenceError: data is not defined"传递给 Controller

asp.net-core - 我如何知道 Linux 中是否安装了 ASP.NET Core?

c# - 注入(inject)和 WebAPI : Getting started after install from NuGet

asp.net-core - 如何处理多层一对多关系的DAL?