Web services DDD:在核心域的有界上下文上分发接口和报告逻辑,还是使用指定的有界上下文(通用域)?

Web services DDD:在核心域的有界上下文上分发接口和报告逻辑,还是使用指定的有界上下文(通用域)?,web-services,reporting-services,domain-driven-design,reporting,bounded-contexts,Web Services,Reporting Services,Domain Driven Design,Reporting,Bounded Contexts,我们正在开发一个基于领域驱动设计(DDD)的体系结构(从头开始),它有大约三个有界的上下文,每个上下文对应一个核心领域。还有一个用于监控应用程序的有界上下文(通用子域),以及一个用于执行计划作业的有界上下文(通用子域)(来自核心域,但被调度器视为黑盒) 还有两个我们不确定如何建模的需求: 报告(即像素精确报告) 与不属于我们领域的外部系统接口(例如,准备一堆XML文件,供政府在夜间通过web服务(WSDL)获取;或将一个核心领域的部分模型公开为简化的SQL数据库,供第三方查询) 我们可以想出

我们正在开发一个基于领域驱动设计(DDD)的体系结构(从头开始),它有大约三个有界的上下文,每个上下文对应一个核心领域。还有一个用于监控应用程序的有界上下文(通用子域),以及一个用于执行计划作业的有界上下文(通用子域)(来自核心域,但被调度器视为黑盒)

还有两个我们不确定如何建模的需求:

  • 报告(即像素精确报告)
  • 与不属于我们领域的外部系统接口(例如,准备一堆XML文件,供政府在夜间通过web服务(WSDL)获取;或将一个核心领域的部分模型公开为简化的SQL数据库,供第三方查询)
我们可以想出两种方法:

  • 将报告和接口集成到它们所属的有限上下文中,从而可能复制基础架构代码

    • 在报告的情况下,我们会将报告定义文件(如Microsoft的RDL)检入到各个有界上下文的Git存储库中,并将它们部署到集中的报告服务器
    • 在接口的情况下,我们将开发前面提到的XML生成逻辑和web服务作为该有界上下文的Git存储库中的项目,并将其部署为该有界上下文的一部分
  • 创建指定的有界上下文,用于报告和连接每个上下文,从而统一技术,但分布核心域的各个方面

    • 在报告的情况下,我们将在指定的Git存储库中管理属于不同核心域的所有报告定义文件,以及创建和显示报告所需的所有代码
    • 在接口的情况下,我们将在一个Git存储库中管理所有核心域的所有“端口和适配器”,可能使用一组非常异构的接口技术,如REST、WSDL、OpenAPI或SQL。然后,这个有界上下文将使用它应该与之接口的有界上下文的已发布语言(在我们的例子中,这是使用开放API标准的所有Web API),并为自己提供外部世界的接口

  • 我认为讨论可以归结为两个独立的方面:技术和商业。我们是应该将所有与业务相关的内容放在一起,还是应该围绕技术/基础架构(即所有与接口相关的内容和所有与报告相关的内容)进行组合?

    正如您所指出的,选项1将复制基础架构代码,这听起来像是代码中的气味

    选项2将分布核心域的方面,但这很好,因为有界上下文可以相互通信


    此外,在您的情况下,报告和与外部系统的接口都是其自身的有界上下文,因此在您的应用程序中它应该是一个单独的层/上下文。

    正如您所指出的,选项1将复制基础结构代码,这听起来像是代码中的气味

    选项2将分布核心域的方面,但这很好,因为有界上下文可以相互通信


    此外,在您的情况下,报告和与外部系统的接口都是其自身的有限上下文,因此在您的应用程序中应该是一个单独的层/上下文。

    您是如何进行的?我们选择了第二种解决方案,即通过报告/接口分组,并以集中的方式处理这些方面。然而,所有业务信息源仍在各自的有限上下文中,报告和接口都只是对该数据进行技术转换/聚合。您是如何进行的?我们选择了第二种解决方案,即通过报告/接口分组,并以集中的方式处理这些方面。然而,所有业务信息源仍然在各自的有限上下文中,报告和接口都只是对数据进行技术转换/聚合。