내 모델 계층에는 데이터 맵퍼, 도메인 개체 및 "서비스"(모델 계층 외부에 있음)가 있습니다. 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 위반으로 이어질 것입니다.
짧게 :도메인 객체를 반환하려면 데이터 매퍼가 도메인 객체 팩토리에 액세스 할 수 있습니까?
D-R-Y를 위반하지 않고 컬렉션을 처리하는 매퍼를 만드는 방법은 무엇입니까? – orourkek
@orourkek, 이것이 문제가 될 수 있다고 생각되면 단일 항목 및 컬렉션에 대해 동일한 매퍼를 사용할 수 있어야합니다. 콜렉션은 다른 인터페이스를 구현할 것이고,이 인터페이스를 체크하기 만하면된다. 나는 이것에 조심할 것이지만. 내 경험에 따르면 컬렉션의 매핑은 개념적 수준에서만 서로 다른 엔터티 매핑과 유사합니다. 코드 작성을 시작하면 완전히 다른 것으로 판명됩니다. –