2012-08-08 4 views
3

내 모델 계층에는 데이터 맵퍼, 도메인 개체 및 "서비스"(모델 계층 외부에 있음)가 있습니다. DomainObjectFactory와 DataMapperFactory를 구현하기로 결정했는데, DM < -> DO 관계에 붙어 있습니다. 이상적으로 데이터 매퍼는 "get"/ "read"를 수행하는 모든 메소드에 대해 관련 도메인 객체의 인스턴스 (또는 인스턴스 배열)를 반환하지만 데이터 매퍼는 도메인 객체 팩토리에 액세스 할 수 없습니다.데이터 맵퍼가 도메인 객체를 반환하는 방법은 무엇입니까?

DM 및 DO에 대한 팩토리 패턴이 없으면 오토 로더가 DM 내에서 인계되어 DO 인스턴스가 생성 될 수 있습니다. 그러나 이것을 공장에서 어떻게 완성 할 수 있습니까?

내가 생각할 수있는 한 가지 가능한 해결책은 예를 들어, 데이터 매퍼 방법에 관련 도메인 객체의 인스턴스를 전달하는 것입니다 :

$user = $this->domainObjectFactory->build('user'); 
    $mapper = $this->dataMapperFactory->build('userMapper'); 

    //Pass an [empty] user DO to the DM, which will be returned back 
    $mapper->getById($someIDValue, $user); 

이 옵션은 매우 더러운 것, 그러나 그것은 하나의 GET을 위해 일 것 행동 양식. 그러나 도메인 객체의 배열을 반환 할 때 의미 론적으로 비계천적으로 진행되므로 분명히 이것을 수행하는 최선의 방법은 아닙니다 ... 또 다른 옵션은 도메인 객체 팩토리에 대한 데이터 맵퍼 액세스를 허용하는 것입니다. 하지만 이는 대규모 LOD/SRP 위반으로 이어질 것입니다.

짧게 :도메인 객체를 반환하려면 데이터 매퍼가 도메인 객체 팩토리에 액세스 할 수 있습니까?

답변

4

는 I는 다음과 같이하여 해결 :

$user = $this->domainObjectFactory->build('user'); 
$mapper = $this->dataMapperFactory->build('userMapper'); 

$user->setName('Foobar'); 
$mapper->fetch($user); 
// mapper acquires entries that are related to user with name `"Foobar"` 
// and loads it into the domain object 

아이디어는 저장 부로부터 데이터를 검색 매퍼 상태 도메인 개체의 기존 파라미터를 사용한다는 것이다. 도메인 개체 목록을 처리하는 경우 대신 컬렉션이있는 작업으로 매퍼를 만들고 해당 컬렉션에 조건을 할당합니다.

또한 this answer은 간접적으로 문제와 관련이 있습니다.

+1

D-R-Y를 위반하지 않고 컬렉션을 처리하는 매퍼를 만드는 방법은 무엇입니까? – orourkek

+1

@orourkek, 이것이 문제가 될 수 있다고 생각되면 단일 항목 및 컬렉션에 대해 동일한 매퍼를 사용할 수 있어야합니다. 콜렉션은 다른 인터페이스를 구현할 것이고,이 인터페이스를 체크하기 만하면된다. 나는 이것에 조심할 것이지만. 내 경험에 따르면 컬렉션의 매핑은 개념적 수준에서만 서로 다른 엔터티 매핑과 유사합니다. 코드 작성을 시작하면 완전히 다른 것으로 판명됩니다. –

관련 문제