Domain driven design 翻译层和反腐败层之间的实现差异

Domain driven design 翻译层和反腐败层之间的实现差异,domain-driven-design,Domain Driven Design,从概念上讲,我理解翻译层和反腐败层之间的区别,但就实现而言,这两者之间的区别在于,对于翻译层,我们没有门面,也没有驻留在翻译层中的服务,也没有适配器,而是域代码本身(驻留在有界上下文中)调用转换器 a、 如果外部系统ES实际上是另一个应用程序的一部分并提供功能(我们的受限上下文BC需要)通过其应用层并直接从其域层,我们的BC应如何请求其所需的服务?通过与ES的应用层通信或通过与ES的域层通信(通过翻译/反腐败层) b、 当我们的BC通过ES应用层请求功能时,为什么不需要翻译/反腐败层,因为它通过

从概念上讲,我理解翻译层和反腐败层之间的区别,但就实现而言,这两者之间的区别在于,对于翻译层,我们没有门面,也没有驻留在翻译层中的服务,也没有适配器,而是域代码本身(驻留在有界上下文中)调用转换器

  • a、 如果外部系统ES实际上是另一个应用程序的一部分并提供功能(我们的受限上下文BC需要)通过其应用层并直接从其域层,我们的BC应如何请求其所需的服务?通过与ES的应用层通信或通过与ES的域层通信(通过翻译/反腐败层)

    b、 当我们的BC通过ES应用层请求功能时,为什么不需要翻译/反腐败层,因为它通过ES应用层接收的数据仍然需要转换为域概念

    c、 如果ES实际上是我们自己的应用程序的一部分,那么我假设唯一的选择是我们的BC通过翻译/反腐败层与ES的域层“直接”通信来请求功能

  • 转换是ACL所做的。这些不是独立的概念。可以通过各种方式实现。但重点是保护您的域不受外部系统的影响。ACL通过将外部系统的模型转换为本地域模型来实现这一点
  • 2a.本地BC应通过应用程序服务或开放主机服务(基本上是一种web服务)与外部BC通信。只有当两个BC同时开发并且您拥有实现这两个BC的直接库时,前者才可行。后者适用于第三方BC或被服务完全封装

    这仍然需要实现,除非这两个BCs是并行开发的,并且有一个共享的内核。然而,我不是共享内核的超级粉丝


    2c.您的BC仍然需要通过ES的应用程序服务与ES通信。它不应该直接访问域对象。更好的是,让BC调用的web服务公开ES功能。

    关于ACL的一个问题。ACL在外部*有界上下文和我们自己的有界上下文的域模型之间转换(在解决方案中的另一个.dll中定义为外部)。为了能够转换,我们的ACL仍然必须有一个对外部系统模型的引用,以便正确访问所有对象属性,然后进行转换。我的想法是否错误?