DDD:使用不同逻辑的DTO

时间:2017-05-13 10:03:36

标签: architecture domain-driven-design dto

我目前正在研究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-to-domain" logic"将被域名转换为UI"逻辑"因此从开发人员的角度来看,我们在阅读时需要小心这个DTO,因为我们现在不会它是后退还是没有。换句话说:我们真的无法信任"这个DTO。

另一方面,这个回退逻辑在UI层更方便,因为UI在从域请求后不会关心翻译对象:它将始终包含正确的文本。

此外,由于我们需要管理这些翻译(例如在管理员后端),我们现在将有2个端点而不是一个:一个用于请求DTO与他们的"真实"值(没有后备),以及一个用它们的后备值请求它们。

你们怎么看待这种方法,哪种方法是最好的做法?或者有更好的替代方法吗?

干杯

1 个答案:

答案 0 :(得分:1)

首先,您不应该查询您的域名,因此DTO应该只是用于UI到域。

事情的查询方面可能很好地返回一些简单的结构来表示数据,但意图是不同的。由于域不会提供此区域设置数据,您最终可能会生成本地化文件以便直接查询,然后在前端执行回退(例如在SPA情况下),或者您生成的主本地化文件已包含回退

即使您要返回一些结构,甚至是DTO,并且您决定在服务器上执行回退,提供回退文本或指示提供的文本是回退值可能很有用,所以:

{
   locale: 'fr',
   text: undefined,
   fallback: 'Anglais'
}

,或者

{
   locale: 'fr',
   text: 'Anglais',
   fallback: true
}

我在SPA解决方案中所做的通常是在内部使用i18next.js it ,因为提供了回退区域设置,因此负责回退。如果缺少所请求的资源,则检索回退;否则显示请求的密钥。

无论如何,只是一些想法:)