【发布时间】:2014-07-16 04:40:29
【问题描述】:
根据 Stack Overflow 上的this question,在 DDD 架构中,“帮助器”类可以根据其用途位于不同的层中。例如,以用户友好的方式格式化某些内容的助手将进入 UI。数据库助手将进入基础设施。
但是可以被多个层使用的助手呢?例如年龄计算。业务逻辑的模型层可能需要年龄。它被多个实体使用,因此不应位于特定实体中。还有一些地方需要年龄只是为了在 UI 中显示。同样,我有多个层可以使用的字符串函数。例如,我的自定义 Right 和 Left 方法可用于 UI 中的格式设置,但它们也可能用于模型中,例如基于前缀的条件逻辑。
那么这些常用的方法应该去哪里呢?我的设置是这样的:
- 用户界面
- 应用
- 型号
- 基础设施
模型是核心,不依赖于基础设施,所以普通助手不能进入基础设施。我正在考虑两种选择:
1) 有另一个层,称为 Common 或类似的层,任何层都可以使用。这会在 Model 和 Common 之间创建依赖关系。
2) 在任何需要的层中复制辅助逻辑。例如,在 UI 中有一个 Age helper,在 Model 中有一个 Age helper。这会违反 DRY,但不需要域依赖于“公共”层。
哪个选项更好?模型层是否可以依赖“公共”层?
更新:
在提出这个问题后的 2.5 年里,我得出结论:
- 诸如 Right、Left 等弥补框架限制的事物属于“通用”实用程序/帮助组件,甚至模型/域层都依赖它。
- “通用”实用程序/帮助程序组件不应很大。随着经验的积累,我发现很多我认为是帮助者的东西实际上都属于领域模型。
- 年龄属于领域层中它自己的类。就像地址、电话号码和金钱之类的东西一样,我认为这些东西是价值对象。理解值对象确实是我理解创建可合并到其他类中的可重用领域类的关键。
【问题讨论】:
-
你有比年龄计算更好的例子吗?或者您能否详细说明该示例的复杂性?
-
@MattDavey 我还提到了字符串示例,其中我在 UI 中使用自定义的 Right 和 Left 方法进行格式化,但也在域中使用,例如基于前缀的条件逻辑。实际上并没有多少“帮助者”会落入这种需要不止一层的场景中。我的大多数助手都可以整齐地插入特定层,但正如我所提到的,有一些是跨层所必需的。
标签: architecture domain-driven-design