【发布时间】:2017-10-12 14:30:08
【问题描述】:
我目前正在从事一个 DDD 项目,最近遇到了有关使用 DTO 的问题。
我的域中有以下 DTO(代码是 php,但可以是任何语言):
class TranslationDto {
private $locale;
private $text;
public function getLocale(...);
public function getText(...);
}
目标是 UI 将为域提供具有区域设置及其相应文本的 DTO。例如,如果区域设置“FR”未翻译,则 DTO 将如下所示:
// UI => domain, for example when willing to persist the data (write)
TranslationDto [
'locale' => 'FR',
'text' => null,
]
现在的问题:
在 UI 到域的流程中,如果未翻译语言环境,则 DTO 的 $text 值将是 null。
我在 Domain-to-UI 端实现了相同的逻辑,这意味着如果没有翻译语言环境,那么 DTO 的 $text 值将是 null。
但是,我团队中的一位开发人员添加了回退逻辑,例如,如果 FR 区域设置不存在,则域将返回默认区域设置(例如 EN)。返回的 Domain-to-UI 对象将如下所示:
TranslationDto [
'locale' => 'FR',
'text' => 'The fallback text, in english',
]
对此我感到很尴尬,因为 UI 到域的“逻辑”会被域到 UI 的“逻辑”破坏,因此从开发人员的角度来看,我们需要小心这个 DTO阅读它时,如果它是否被回退,我们现在不会。换句话说:我们不能真正“信任”这个 DTO。
另一方面,这种回退逻辑在 UI 层更方便,因为 UI 不会关心在从域请求对象后翻译对象:它始终包含正确的文本。
此外,由于我们需要管理这些翻译(例如在管理后端),我们现在将有 2 个端点而不是 1 个:一个用于请求具有“真实”值的 DTO(没有回退),一个用于用他们的后备值请求他们。
你们对此有何看法,哪种方法是最佳实践?或者有没有更好的替代方法?
干杯
【问题讨论】:
标签: architecture domain-driven-design dto