2010-04-23 2 views
3

나는 의존성 삽입의 중요성을 다음과 같은 문제가 일시 정지 저를주고 왜 단위 테스트에서의 역할 이해 : 난 못해 어려움을 겪고PHP OOP : 도메인 모델 패턴의 싱글/정적 방법을 피

한 영역을 싱글 톤을 사용하는 것은 아이덴티티 맵/작업 단위 패턴입니다 (도메인 객체 상태를 감시합니다).

//Not actual code, but it should demonstrate the point  

class Monitor{//singleton construction omitted for brevity 
    static $members = array();//keeps record of all objects 
    static $dirty = array();//keeps record of all modified objects 
    static $clean = array();//keeps record of all clean objects 
} 

class Mapper{//queries database, maps values to object fields 
    public function find($id){ 
     if(isset(Monitor::members[$id]){ 
     return Monitor::members[$id]; 
    } 
    $values = $this->selectStmt($id); 
    //field mapping process omitted for brevity 
    $Object = new Object($values); 
    Monitor::new[$id]=$Object 
    return $Object; 
} 

$User = $UserMapper->find(1);//domain object is registered in Id Map 
$User->changePropertyX();//object is marked "dirty" in UoW 

// at this point, I can save by passing the Domain Object back to the Mapper 
$UserMapper->save($User);//object is marked clean in UoW 

//but a nicer API would be something like this 
$User->save(); 

//but if I want to do this - it has to make a call to the mapper/db somehow  
$User->getBlogPosts(); 

//or else have to generate specific collection/object graphing methods in the mapper 
$UserPosts = $UserMapper->getBlogPosts(); 
$User->setPosts($UserPosts); 

이 상황을 어떻게 처리 할 수 ​​있는지에 대한 조언이 있으십니까?

도메인 개체 내에서 DI를 만족시키기 위해 매퍼/데이터베이스 액세스의 인스턴스를 전달/생성하는 것은 매우 힘듭니다. 동시에 도메인 개체 내에서 외부 정적 메서드로 많은 호출이 발생하는 것을 피하십시오.

"저장"을 해당 동작의 일부로 지정하려면 그렇게 할 수있는 기능이 필요합니다. 아마도 그것은 책임있는 문제 일 것이고, 도메인 객체는 저축으로 인해서는 안된다. 액티브 레코드 패턴의 깔끔한 기능입니다. 어떤 식 으로든 구현하는 것이 좋습니다.

답변

1

최선의 행동 방침이 아닐지라도 FI : user_User은 도메인 객체이고, user_mapper_User은 매퍼입니다.

부모님은 domainObject 클래스에서 나는 매퍼를 찾기 위해 로직을 코딩합니다.

그런 다음 위임 할 수있는 몇 가지 옵션이 있지만 domainObject__call() 메서드를 사용하는 것이 좋습니다.

+0

물론 그렇습니다. 문제는 다음과 같습니다. 매퍼의 새로운 인스턴스를 만들거나 매퍼에 대한 정적 호출을 만드시겠습니까? 사용자 외부에 존재하는 사용자 매퍼가 이미 존재해야합니다. 당신이 새로운 매퍼를 호출하면, 당신은 아마도 작업 단위 및 ID 맵에 대한 참조를 포함하여 새 DB 핸들을 호출해야합니다 ... - 외부 클래스는 이미 모든이 설정을 가지고 있지만 – sunwukung

+0

DB 핸들을 저장합니다 내 경우에는 MDB2) 부모 매퍼 클래스 정적, 그래서 얼마나 많은 매퍼 인스턴스를 가지고, 그들은 모두 동일한 핸들을 공유합니다. –

+1

아, 지금은 Monostate 클래스 패턴이 맞습니까? – sunwukung