Domain driven design DDD:域间引用设计问题?

Domain driven design DDD:域间引用设计问题?,domain-driven-design,Domain Driven Design,DDD对域间引用设计的建议是什么 我应该尝试将它们连接为“Matryoshka”(将一个连接到另一个)还是创建更高级别的“域间”业务服务更好 顺便说一句,穿过这片平静的水域,我在互联网上找不到任何有用的东西,我开始思考,对于这类事情,存在着比“域间引用”更好的术语。。。我说得对吗 详情: 我有两种型号/商务服务 从语义上讲,第一个域(A)是我们商品的销售/维护过程的CRM,第二个域(B)是我们商品的“设计”数据。我们对我们的货物有两种观点:卖方观点和工程师观点 实际上,每个模型都是针对同一数据库

DDD对域间引用设计的建议是什么

我应该尝试将它们连接为“Matryoshka”(将一个连接到另一个)还是创建更高级别的“域间”业务服务更好

顺便说一句,穿过这片平静的水域,我在互联网上找不到任何有用的东西,我开始思考,对于这类事情,存在着比“域间引用”更好的术语。。。我说得对吗

详情:

  • 我有两种型号/商务服务
  • 从语义上讲,第一个域(A)是我们商品的销售/维护过程的CRM,第二个域(B)是我们商品的“设计”数据。我们对我们的货物有两种观点:卖方观点和工程师观点
  • 实际上,每个模型都是针对同一数据库的有效ORM(对象关系映射)工具
  • 存在一些域间活动,例如验证(例如,有时我们可以向smb出售产品。只有在某些工程规则有效的情况下)

  • 从开发人员的角度来看,我有两种明确的可能性(在A中引用B或创建新的交叉引用域/服务C)。但从设计师的角度来看,当我从两个不同的域组成业务逻辑时,我无法理解我拥有什么样的业务服务。

    据我所知,DDD对于“域间”引用没有严格的规则。最终,您的域模型必须引用基本的Java或.NET类。或者它可以引用专门的日期/时间或图形库(也称为“通用域”)

    另一方面,DDD有一个概念。当你在系统的边界工作时,它有很多模式可以应用。例如,“反腐败层”可用于将您与遗留系统隔离。根据您对外部代码、团队能力等的控制程度,可以使用其他集成样式

    所以,如果您只在一个有界上下文中处理两个子域,则可能不需要引入人工粘合层。可能也值得一读(战略设计)的第4部分

    更新:


    根据您提供的信息,您似乎只有一个有界上下文。在同一个词有两种不同含义的情况下,你似乎没有“语言冲突”。有界上下文集成模式很可能不适用于您的情况。您的销售域可以直接引用产品域。如果你认为产品领域更低级,销售更高级,你可以使用。在Sales中定义一个接口,如
    ProductCompatibilityValidator
    ,并在Products domain中实现它。然后在应用层注入实际实现。这样一来,你就不会直接从销售到产品。

    除了Dmitry已经说过的话之外

    我认为任何跨越有界上下文的代码都是应用层代码。我会让应用层代码引用两个上下文(及其存储库)中的域类型,但不会让两个域相互引用。我认为,如果业务逻辑特别跨越域边界,并且是单元可测试的,那么在应用程序层中使用业务逻辑是可以的

    如果您真的有一个层次结构,那么可以让更具体的子域引用更抽象的域。但是,如果这导致您需要使用任何类型的域对象引用存储库,我会非常小心。从存储库中拉出对象很少是真正的域概念。引用存储库最好在位于域模型之上的应用程序层中完成


    当然,这既是科学也是艺术。我会尝试用两种不同的方法对应用程序的一个薄片进行建模,看看每种方法都会遇到什么摩擦。

    你能提供一个具体的例子来说明你的意思吗?谢谢你的支持。我在问题中添加了一些细节,域间通信的示例可能是:验证订单,这意味着根据存储在“远程”域中的规则在“订单创建时”验证商品兼容性。感谢您的支持。其他的集成风格是什么?我完全可以控制外部代码。我是否正确地理解,有界上下文是处理一个域的两个不同模型的方法,并且通常不用于粘合两个不同的域?