域驱动设计鼓励您使用丰富域模型。这意味着所有的领域逻辑都位于领域模型中,并且领域模型是至高无上的。持久性成为外部关注点,因为领域模型本身理想化地不知道持久性(例如数据库)。扩展丰富域模型
我在一个中等规模的单人项目(> 10万行Java)上一直在使用它,我发现了很多优点,主要是它提供的灵活性和可重构性超过了面向数据库的方法。我可以添加和删除域类,点击几个按钮,并完成一个新的数据库模式和SQL层。
不过,我经常面对在那里我发现很难与事实有一个SQL数据库备份的应用程序调和丰富域逻辑的问题。通常,这会导致典型的“1 + N查询问题”,您可以在其中获取N个对象,然后在每个对象上执行一个不重要的方法,以再次触发查询。手工优化这个功能可以让你在不断的SQL查询中完成这个过程。
在我的设计中,我允许系统插入这些优化版本。我通过将代码移动到包含数十个特定于域的查询(例如getActiveUsers)的“查询模块”中来完成此操作,内存(天真且不可扩展)和基于SQL(用于部署)的实现。这使我能够优化热点,但有两个主要缺点:
- 我有效地移动我的一些领域逻辑的地方并不真正属于的地方,而事实上,即使将其推入SQL语句。
- 过程需要我细读查询日志,找出热点是,在这之后我不得不重构代码,通过降低成查询降低其级别的抽象。
有调和领域驱动设计和使用的事实,你不能在内存中的所有的实体,因此被限制在后端数据库以其丰富的域模型更好,更清洁的方式?
我想一个真正的根本性的改善方法需要不同的语言范式,在那里你描述你的逻辑的部分声明,以便它可以自动被编译成疑问......但这种故事有其自身的问题份额: - ) – 2008-12-19 09:15:23