我将自己沉浸在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,不再是纯粹的对象(POCO,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的新手)我完全离开了基地,在这种情况下,我们非常欢迎任何意见或建议。
由于
答案 0 :(得分:1)
我的理解是,selenium表达式也不属于Application Service层,因为这会使类/方法膨胀,理想情况下服务层应该很薄。
是的,你是对的。 Selenium表达式应保留在Infrastructure中,因为它们是特定于技术的。
这意味着Page实体开始倾向于贫血模型,并且正在成为一个简单的DTO。如果是这样,这个实体甚至还需要了吗?
如果该领域贫血(请阅读'简单')那么该模型也将是贫血的。
当我们考虑应用程序的写入部分时,当行为保留在域服务中时,当它应该保留在聚合中时,贫血有意义。
如果是这样,这个实体甚至还需要了吗?
如果 thing 具有生命周期(它具有标识;它已创建,修改然后消亡),那么是,实体是必需的。如果缺少行为(因为域很简单),您可能有一个CRUD实体而不是一个完整的DDD聚合。您可以采取其他战略或战术DDD决策(如有界上下文和上下文映射)。
Application Service层是否可以直接调用Infrastructure层并执行某些操作(执行用例)而不涉及任何实体(以及域)?
是
答案 1 :(得分:0)
在HTML中搜索字符串不是业务逻辑,因此域驱动设计不应该适用于此。
DTO或没有表示页面行为的类在这里有意义。
如果需要对Selenium特定实现或跨应用程序的可重用性进行抽象,那么“搜索服务”将成为基础架构问题。如果不需要,它将是特定于应用程序的服务/实用程序。