首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外部数据映射到域

外部数据映射到域
EN

Stack Overflow用户
提问于 2017-06-27 09:32:05
回答 2查看 572关注 0票数 0

这感觉就像我指的是DDD主题的上下文映射和反腐败层,但我不知道如何解决它。

如何从外部数据源构建/映射域对象?

例如,可以有多个数据源(db、文件、外部服务)。由于我试图构建尽可能类似于洋葱的体系结构,这意味着我的域没有依赖关系。基础设施取决于域(具体而言,基础设施实现域接口)

  1. 如果基础设施必须依赖域(反之亦然),是否意味着外部数据映射应该在存储库内进行?
  2. 如果通过构造函数创建对象被视为业务逻辑,那么如何将外部数据映射到域对象(不应该泄漏到域以外的任何地方)?倒影?其他方式?也许我误解了整个概念?
  3. 如果域对象创建需要来自多个源(服务、文件、db)的数据,这是否意味着应用程序服务和基础设施(存储库)之间应该有一个单独的层来从多个存储库中提取数据,是否所有映射和返回结果的域对象?
EN

回答 2

Stack Overflow用户

发布于 2017-06-27 13:58:24

如何从外部数据源构建/映射域对象?

据我所知,有两种方法。

最常见的是,应用程序通过对值的共同理解与域模型进行通信。应用程序获取它所具有的表示(例如,文件中的字节),并从它构建域模型将理解的表示。您可能会通过工厂(了解如何将原始值转换为值类型)或构建器来实现这一点。

更少见的方法是,应用程序采用它所拥有的表示,并将其封装在域模型将识别的适配器中(而不是构建具体类型)。在这种风格中,值类型看起来更像角色接口,使域模型对底层数据模型一无所知。

如果域对象创建需要来自多个源(服务、文件、db)的数据,这是否意味着应用程序服务和基础设施(存储库)之间应该有一个单独的层来从多个存储库中提取数据,是否所有映射和返回结果的域对象?

我希望存储库本身能够完成这项工作--存储库的角色是对键值存储的抽象。

帕纳斯

相反,我们建议首先列出一些困难的设计决策或可能会发生变化的设计决策。然后,每个模块都被设计成对其他模块隐藏这样的决定。

服务/file/db的选择是一个应该隐藏在模块(存储库)中的决策的一个例子,该模块的接口“被选择以尽可能少地显示其内部工作”。

票数 1
EN

Stack Overflow用户

发布于 2017-06-27 18:55:17

我更喜欢通过反腐败层的明确实现来做到这一点。我的域通常接受命令来执行任何操作,这是域模型可以接受的。这包括创建对象和执行状态转换。

ACL部分从外部数据源读取数据,或通过任何其他方式从它们接收数据。然后将这些数据转换为有效的域命令。所有预检查都是通过ACL完成的,ACL知道外部数据格式和域。

在某些情况下,一个外部事件导致域中的多个操作,甚至跨多个有界上下文的多个操作。这通常是通过使用过程管理器来完成的。

可以像您描述的那样,多个外部数据源需要查询才能构造一个有效的域命令。在这种情况下,ACL就是这样做的,因为域中只有一个事务。当外部源也需要某种类型的确认时,它可能变得更加复杂,流程管理器也可用于此目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44776829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档