域驱动设计(DDD):域或基础设施关注

时间:2018-01-24 14:23:55

标签: python architecture entity domain-driven-design ddd-service

我将自己沉浸在DDD中,并对域的内容以及基础架构问题提出疑问。

描述域名的简化示例:

应用程序中的一个上下文是关于便利功能,允许用户检查网页上的某些信息。即..

"用户想要检查网页并确定短语" lorem ipsum"出现在什么位置。"

我们将使用Selenium作为匹配短语的基础技术。

在深入研究DDD之前,我会创建一个如下所示的类(下面的Python,但语言并不重要):

class Page:
def __init__(self, url, environment, driver):
    self.environment = environment
    self.url = url
    self.driver = driver    // Selenium Driver


def contains_phrase(self, phrase):
    self.driver.get(self.environment.url + self.url_suffix)  // Selenium Command
    ...

此实体现在依赖于selenium,不再是纯粹的对象(PO​​CO,POJO等)。在DDD中,这对我来说并不合适。

我的理解是,selenium表达式也不属于Application Service层,因为这会使类/方法膨胀,理想情况下服务层应该很薄。

这是否属于Infrastructure层?就像存储库中存在持久性代码的存储库一样。类似的东西:

class PageAutomator:
...
def does_page_contain_phrase(self, page, phrase):
    self.driver.get(self.environment.url + self.url_suffix)  // Selenium Command

这听起来像是正确的方向吗?如果是这样的话?:

这意味着Page实体开始倾向于贫血模型,并且正在成为一个简单的DTO。如果是这样,这个实体甚至还需要了吗?

应用服务层是否可以直接调用基础架构层并执行某些操作(执行用例)而不涉及任何实体(以及域)?即使采用更多的事务脚本方法,我的理解是Selenium功能仍然不应该存在于域中吗?

或者(我是DDD的新手)我完全离开了基地,在这种情况下,我们非常欢迎任何意见或建议。

由于

2 个答案:

答案 0 :(得分:1)

  

我的理解是,selenium表达式也不属于Application Service层,因为这会使类/方法膨胀,理想情况下服务层应该很薄。

是的,你是对的。 Selenium表达式应保留在Infrastructure中,因为它们是特定于技术的。

  

这意味着Page实体开始倾向于贫血模型,并且正在成为一个简单的DTO。如果是这样,这个实体甚至还需要了吗?

如果该领域贫血(请阅读'简单')那么该模型也将是贫血的。

当我们考虑应用程序的写入部分时,当行为保留在域服务中时,当它应该保留在聚合中时,贫血有意义。

  

如果是这样,这个实体甚至还需要了吗?

如果 thing 具有生命周期(它具有标识;它已创建,修改然后消亡),那么是,实体是必需的。如果缺少行为(因为域很简单),您可能有一个CRUD实体而不是一个完整的DDD聚合。您可以采取其他战略或战术DDD决策(如有界上下文和上下文映射)。

  

Application Service层是否可以直接调用Infrastructure层并执行某些操作(执行用例)而不涉及任何实体(以及域)?

答案 1 :(得分:0)

在HTML中搜索字符串不是业务逻辑,因此域驱动设计不应该适用于此。

DTO或没有表示页面行为的类在这里有意义。

如果需要对Selenium特定实现或跨应用程序的可重用性进行抽象,那么“搜索服务”将成为基础架构问题。如果不需要,它将是特定于应用程序的服务/实用程序。