在DDD /分层架构中将常量存储在何处

时间:2020-01-22 03:42:35

标签: domain-driven-design constants

例如,我有一个Media实体,它有MediaType值对象,负责保存/创建媒体类型。存储可能的媒体类型常量列表的最佳位置是什么?首先,我认为要存储在MediaType内部是因为它负责创建类型。但是,如果我需要在应用程序层或接口层中验证请求,甚至在查询中,该怎么办?

就像我想隔离域一样,我无法在MediaType中存储常量,因为我无法在域之外使用它。或者仅在域层中使用常数,然后在其他地方对其进行硬编码,这对我来说似乎是不正确的,因为在这种情况下,我们没有一个地方可以更改它。第三种选择是创建像MediaConstants这样的单独的常量类,并将其存储在域的外部(不确定位置),但是在这种情况下,看起来我们根本不需要MediaType VO。

在DDD中处理常量的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

隔离域当然是您所追求的。这意味着您的域包含所有相关的不变量,并且已经完成枚举等,而这些枚举等都需要使域模型具有表现力。

有时候,“外部”世界将要求进行各种 duplicate 复制,以使事情变得更加轻松和便捷。例如,您的域检查电子邮件地址的格式正确这一事实并不意味着您的Web前端也不执行该验证。您可以可以在前端放弃这样的电子邮件验证,但这最终将给用户带来相当糟糕的体验。为了方便起见,我们在前端“重复”了验证。

某些数据也是如此。平面分类结构的通用方法可能是ReferenceType 1- * ReferenceItem,其中ReferenceType.NameMediaType,而ReferenceItem.Name是您需要的任何值。有时您可以将CodeIsSystemType作为参考项目,但这是一般性的想法。每种引用类型都将具有一个或多个引用项,因此可以很容易地将持久性保持在某些数据存储中的一对多关系。然后,您可以通过查询机制将这些值显示在前端,并且在集成层/关注点(Web控制器/消息处理程序)中,您可以获取相关的项目名称(或代码),并将其映射到您的枚举中。