从存储库中获取可能需要的数据 - DDD
Fetching potentially needed data from repository - DDD
我们有(大致)以下架构:
- 应用程序服务执行基础架构工作 - 从隐藏在接口后面的存储库中获取数据。
- 创建对象图并将其传递给适当的域服务。
- 域服务执行它并引发适当的事件。
- 事件在不同的应用程序服务中处理,这些服务执行一些持久性操作(更改存储库、发送电子邮件等)。
不过。领域服务 (3) 变得如此复杂,以至于只有在满足特定条件时才需要来自不同外部 API 的数据。例如 - 如果产品 X 是汽车类型,我们需要从隐藏在 ICatalogService 后面的一些外部 CatalogService(发明的示例)中了解该车型的价格。此操作可能很昂贵(REST 调用)。
我们该怎么做?
一个。我们是否预取应用服务中列为 (1) 的所有数据,即使我们可能不需要它?我们是否将接口 ICatalogService 注入给定的域服务并仅在需要时获取数据?如果域服务的某些其他客户端在不知道其中隐藏了 REST 调用的情况下重复调用此域服务,则后一种解决方案可能会产生性能问题。
或者我们只是把领域模型搞错了?
这个问题与领域驱动设计有关。
没有足够的信息可以给你有针对性的好建议。我怀疑您需要将域重构为更多的子域。听起来您的域服务承担的责任不止一项。保持服务简单。
此外,如果您有一个很长的 运行 任务,例如需要很长时间的服务调用,那么您需要将其架构化。最柔软的设计不会让消费者久等。它会 return 立即向用户提供某种结果,即使它只是一个周期性的状态更新。
How do we go about this?
有两种常见的模式。
一种是传递能力,使查询进入域模型,允许模型在需要时自行获取信息。这通常看起来像是定义一个接口/契约,它将被域模型使用,但在 application/infrastructure 层中实现。
另一个是扩展领域模型和应用程序之间的协议,这样我们就可以向应用程序层发出信号,告诉应用程序层需要什么信息,然后应用程序代码可以决定如何提供它。您最终会得到类似于进程状态机的东西,应用程序代码协调外部 api 和域模型之间的信息交换。
如果你发挥一点想象力,你已经有了一个像这样的状态机;因为您的应用程序代码已经在协调输入到存储库和域模型的移动。当然,区别在于现有的“状态机”足够简单和线性,以至于根本看不出存在状态机。
how exactly would you signal application layer?
简单查询;也就是说,应用程序代码从领域模型中提取它需要的信息,并使用该信息计算下一个动作。操作完成后,应用程序代码将信息推送到域模型。
我们有(大致)以下架构:
- 应用程序服务执行基础架构工作 - 从隐藏在接口后面的存储库中获取数据。
- 创建对象图并将其传递给适当的域服务。
- 域服务执行它并引发适当的事件。
- 事件在不同的应用程序服务中处理,这些服务执行一些持久性操作(更改存储库、发送电子邮件等)。
不过。领域服务 (3) 变得如此复杂,以至于只有在满足特定条件时才需要来自不同外部 API 的数据。例如 - 如果产品 X 是汽车类型,我们需要从隐藏在 ICatalogService 后面的一些外部 CatalogService(发明的示例)中了解该车型的价格。此操作可能很昂贵(REST 调用)。
我们该怎么做?
一个。我们是否预取应用服务中列为 (1) 的所有数据,即使我们可能不需要它?我们是否将接口 ICatalogService 注入给定的域服务并仅在需要时获取数据?如果域服务的某些其他客户端在不知道其中隐藏了 REST 调用的情况下重复调用此域服务,则后一种解决方案可能会产生性能问题。
或者我们只是把领域模型搞错了?
这个问题与领域驱动设计有关。
没有足够的信息可以给你有针对性的好建议。我怀疑您需要将域重构为更多的子域。听起来您的域服务承担的责任不止一项。保持服务简单。
此外,如果您有一个很长的 运行 任务,例如需要很长时间的服务调用,那么您需要将其架构化。最柔软的设计不会让消费者久等。它会 return 立即向用户提供某种结果,即使它只是一个周期性的状态更新。
How do we go about this?
有两种常见的模式。
一种是传递能力,使查询进入域模型,允许模型在需要时自行获取信息。这通常看起来像是定义一个接口/契约,它将被域模型使用,但在 application/infrastructure 层中实现。
另一个是扩展领域模型和应用程序之间的协议,这样我们就可以向应用程序层发出信号,告诉应用程序层需要什么信息,然后应用程序代码可以决定如何提供它。您最终会得到类似于进程状态机的东西,应用程序代码协调外部 api 和域模型之间的信息交换。
如果你发挥一点想象力,你已经有了一个像这样的状态机;因为您的应用程序代码已经在协调输入到存储库和域模型的移动。当然,区别在于现有的“状态机”足够简单和线性,以至于根本看不出存在状态机。
how exactly would you signal application layer?
简单查询;也就是说,应用程序代码从领域模型中提取它需要的信息,并使用该信息计算下一个动作。操作完成后,应用程序代码将信息推送到域模型。