这感觉就像我指的是DDD主题的上下文映射和反腐败层,但我不知道如何解决它。
如何从外部数据源构建/映射域对象?
例如,可以有多个数据源(db、文件、外部服务)。由于我试图构建尽可能类似于洋葱的体系结构,这意味着我的域没有依赖关系。基础设施取决于域(具体而言,基础设施实现域接口)
发布于 2017-06-27 13:58:24
如何从外部数据源构建/映射域对象?
据我所知,有两种方法。
最常见的是,应用程序通过对值的共同理解与域模型进行通信。应用程序获取它所具有的表示(例如,文件中的字节),并从它构建域模型将理解的表示。您可能会通过工厂(了解如何将原始值转换为值类型)或构建器来实现这一点。
更少见的方法是,应用程序采用它所拥有的表示,并将其封装在域模型将识别的适配器中(而不是构建具体类型)。在这种风格中,值类型看起来更像角色接口,使域模型对底层数据模型一无所知。
如果域对象创建需要来自多个源(服务、文件、db)的数据,这是否意味着应用程序服务和基础设施(存储库)之间应该有一个单独的层来从多个存储库中提取数据,是否所有映射和返回结果的域对象?
我希望存储库本身能够完成这项工作--存储库的角色是对键值存储的抽象。
相反,我们建议首先列出一些困难的设计决策或可能会发生变化的设计决策。然后,每个模块都被设计成对其他模块隐藏这样的决定。
服务/file/db的选择是一个应该隐藏在模块(存储库)中的决策的一个例子,该模块的接口“被选择以尽可能少地显示其内部工作”。
发布于 2017-06-27 18:55:17
我更喜欢通过反腐败层的明确实现来做到这一点。我的域通常接受命令来执行任何操作,这是域模型可以接受的。这包括创建对象和执行状态转换。
ACL部分从外部数据源读取数据,或通过任何其他方式从它们接收数据。然后将这些数据转换为有效的域命令。所有预检查都是通过ACL完成的,ACL知道外部数据格式和域。
在某些情况下,一个外部事件导致域中的多个操作,甚至跨多个有界上下文的多个操作。这通常是通过使用过程管理器来完成的。
可以像您描述的那样,多个外部数据源需要查询才能构造一个有效的域命令。在这种情况下,ACL就是这样做的,因为域中只有一个事务。当外部源也需要某种类型的确认时,它可能变得更加复杂,流程管理器也可用于此目的。
https://stackoverflow.com/questions/44776829
复制相似问题