2017-05-13 1 views
0

현재 DDD 프로젝트를 진행하고 있으며 최근에 DTO 사용과 관련된 문제에 직면했습니다. DDD : 다른 로직을 사용하는 DTO 사용

내가 내 도메인에 다음 DTO가 (코드는 PHP에 있지만 모든 언어에있을 수 있습니다) :

class TranslationDto { 
    private $locale; 
    private $text; 

    public function getLocale(...); 
    public function getText(...); 
} 

목표는 UI가 로케일과 그 대응하는 도메인에게 DTO를 줄 것입니다 본문.

지금 질문
// UI => domain, for example when willing to persist the data (write) 
TranslationDto [ 
    'locale' => 'FR', 
    'text' => null, 
] 

: 로케일이 UI - 투 - 도메인 흐름에

인 경우 로케일 "FR"가 번역되지 않은 경우 그래서 예를 들어, DTO는이 다음과 같이 표시됩니다 번역되지 않으면 DTO의 $text 값은 null이됩니다. 로캘이 변환되지 않은 경우 DTOP의 $text 값은 null이 될 것이므로 Domain-to-UI 쪽에서 같은 종류의 논리를 구현했습니다.

그러나 팀의 개발자가 대체 논리를 추가 했으므로, 예를 들어 FR 로켈이 존재하지 않으면 도메인은 기본 로케일 (예 : EN)을 반환합니다.

TranslationDto [ 
    'locale' => 'FR', 
    'text' => 'The fallback text, in english', 
] 

UI를 - 투 - 도메인 "논리"이 도메인에-UI "논리"에 의해 파괴 될 것이다 나는이에 당황했다 : 반환 도메인 - 투 - UI 객체는 다음과 같이 표시됩니다 따라서 개발자의 입장에서 볼 때이 DTO를 읽을 때는 조심해야 할 것입니다. 이제는 DTO가 대체되었는지 여부는 알 수 없습니다. 다른 말로하면, 우리는이 DTO를 정말로 "신뢰"할 수 없습니다.

반면 UI는 객체를 도메인에서 요청한 후에 번역 할 필요가 없기 때문에이 대체 논리는 UI 레이어에서 더 편리합니다. 항상 올바른 텍스트가 포함됩니다.

번역본 (예 : 관리 백엔드)을 관리해야하므로 이제는 하나가 아닌 2 개의 끝점을 갖게됩니다. 즉, "실제"값 (폴백 없음)이있는 DTO와 하나의 끝점 대체 값을 요청하기 위해

당신은 어떻게 생각합니까? 어떤 방법이 가장 좋습니다? 아니면 더 나은 대체 방법이 있습니까? DTO는 정말 그냥 UI - 투 - 도메인에 대한이어야한다, 그래서

건배

답변

1

첫째, 당신은 당신의 도메인을 조회하지 않아야합니다.

사물의 질의 측면은 데이터를 표현하기위한 몇 가지 간단한 구조를 반환하지만 의도는 다릅니다. 이 로케일 데이터는 도메인에서 제공되지 않으므로 직접 쿼리하기위한 현지화 파일을 생성 한 다음 프런트 엔드에서 대체 (예 : SPA의 경우)하거나 생성 된 기본 현지화 파일에 이미 대체 시스템이 있습니다 .

구조체 또는 DTO를 반환하고 서버에서 대체 작업을 수행하기로 결정한 경우에도 대체 텍스트를 제공하거나 제공된 텍스트가 대체 값인 것으로 나타내는 것이 유용 할 수 있습니다. 그래서 :

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

또는, 내가 다 내 SPA 솔루션에서 일반적으로 무엇을 가지고

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

i18next.js을 사용하는 것이었다 그것은, 내부, 대체의 삶을 이후 대체 처리한다 le가 제공됩니다. 요청 된 리소스가 누락 된 경우 폴백이 검색됩니다. 그렇지 않으면 요청 된 키가 표시됩니다.

어쨌든, 몇 가지 생각 :