代码之家  ›  专栏  ›  技术社区  ›  Steven

领域驱动设计(DDD):领域或基础设施问题

  •  1
  • Steven  · 技术社区  · 7 年前

    我沉浸在DDD中,对什么属于该领域以及什么是基础设施问题有疑问。

    描述域的简化示例:

    该应用程序中的一个上下文是关于方便功能的,该功能允许用户检查网页以获取特定信息。即。。

    “用户希望检查网页并确定短语“lorem ipsum”是否出现以及出现在什么位置。”

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

    在深入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
        ...
    

    该实体现在依赖于硒,不再是纯对象(POCO、POJO等)。在DDD中,我觉得这不正确。

    我的理解是,selenium表达式也不属于应用程序服务层,因为这会使类/方法膨胀,而服务层最好是薄的。

    这是否属于基础架构层?很像一个存储库,其中包含持久性代码。类似于:

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

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

    这意味着页面实体开始趋向于贫血症模型,并正在成为一个简单的DTO。如果是这样,这个实体还有必要吗?

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

    或者(我是DDD新手)我完全偏离了底线,在这种情况下,任何建议都是非常受欢迎的。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Constantin Galbenu    7 年前

    我的理解是,selenium表达式也不属于应用程序服务层,因为这会使类/方法膨胀,而服务层最好是薄的。

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

    这意味着页面实体开始趋向于贫血症模型,并正在成为一个简单的DTO。如果是这样,这个实体还有必要吗?

    如果领域贫血(请阅读“简单”),那么模型也将贫血。

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

    如果是这样,这个实体还有必要吗?

    如果您的 事情 有一个寿命(它有一个标识;它被创建、修改,然后 模具 )那么是的,一个实体是必要的。如果缺少行为(因为域很简单),则可以使用CRUD实体,而不是完整的DDD聚合。您可以做出其他战略或战术DDD决策(如有界上下文和上下文映射)。

    应用程序服务层是否可以直接调用基础结构层并执行一些操作(以执行用例),而不需要任何实体(以及域)的参与?

        2
  •  0
  •   Dmitry S.    7 年前

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

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

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