저는 PHP 응용 프로그램 전체에서 생성자 종속성 주입을 연습 해 왔습니다. 나는 객체 생성을위한 코드를 쓰레기로 만들고 싶지 않았고, 공장을 구출하기 위해, 또는 적어도 나는 생각했다.공장에서의 의존성 삽입
구성 요소를 공장으로 배선하는 방법을 설정 한 다음 일부 공장에서는 다른 공장을 사용하여 종속성을 확보하기 시작하여 모든 작성 코드를 한 곳에서 유지합니다. 그러나 일단 공장이 서로를 사용하기 시작하면 (또는 아래 코드에서와 같이) 원형 의존성 문제가 발생하여 간단히 해결할 수 없습니다. 응용 프로그램과
class MapperFactory
{
public function create($type)
{
switch (true) {
case 'Item':
$mapper = new ItemMapper(
$this->create('Field')
);
break;
case 'Field':
$mapper = new ItemMapper(
$this->create('Item')
);
break;
default:
throw new Exception('Unknown mapper');
}
return $mapper;
}
}
$mf = new MapperFactory();
$mf->create('Item');
그것의 간단한 예,하지만 점점 더 일반적인 문제 : 예를 들어, 내 MapperFactory (그들은 전체 객체 그래프 '열망로드'를 구축하기 위해 서로를 필요로) 다른 매퍼와 매퍼를 주입 자체를 사용 개발 중입니다. 다시 PHP (설치 Xdebug는)에서 오류입니다 : PHP는 불평을하는 이유 (이 TBH 오는 보지 않았더라도)
Fatal error: Maximum function nesting level of '100' reached, aborting!
완전 이해합니다.
내 질문은 완전히 공장의 요점을 놓쳤는가? 나는 공장을 올바르게 사용하고 있는가? 그렇지 않은 것처럼 보일지 모르지만 원형 의존성 (꽤 중요하지만) 이외에 공장은 주 애플리케이션에서 모든 건설/배선 논리를 숨기는 우아한 솔루션입니다.
내가이 공장에 문제가 생각하지 않습니다해야합니다. 첫째, "전환 (true)"부분을 얻지 못합니다. "switch ($ type)"가 아니어야합니까? 둘째로, 코드 (끝까지 읽으면)가 끝없이 반복됩니다. 아마도 해당 인스턴스 변수를 사용할 준비가되었을 때만 하위 필드 또는 하위 항목을 만들어야합니다. 또는 재귀를 끝내는 무언가를 생각해 내십시오. – Marvo
'switch (true) ... '는 당신이 쓰려고했던 것이 아닙니다. 그러나'switch ($ type) '을 사용해도'$ type'이'Field' 또는'Item'이면 무한 루프가됩니다. – Yoshi