나는 의존성 삽입의 중요성을 다음과 같은 문제가 일시 정지 저를주고 왜 단위 테스트에서의 역할 이해 : 난 못해 어려움을 겪고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를 만족시키기 위해 매퍼/데이터베이스 액세스의 인스턴스를 전달/생성하는 것은 매우 힘듭니다. 동시에 도메인 개체 내에서 외부 정적 메서드로 많은 호출이 발생하는 것을 피하십시오.
"저장"을 해당 동작의 일부로 지정하려면 그렇게 할 수있는 기능이 필요합니다. 아마도 그것은 책임있는 문제 일 것이고, 도메인 객체는 저축으로 인해서는 안된다. 액티브 레코드 패턴의 깔끔한 기능입니다. 어떤 식 으로든 구현하는 것이 좋습니다.
물론 그렇습니다. 문제는 다음과 같습니다. 매퍼의 새로운 인스턴스를 만들거나 매퍼에 대한 정적 호출을 만드시겠습니까? 사용자 외부에 존재하는 사용자 매퍼가 이미 존재해야합니다. 당신이 새로운 매퍼를 호출하면, 당신은 아마도 작업 단위 및 ID 맵에 대한 참조를 포함하여 새 DB 핸들을 호출해야합니다 ... - 외부 클래스는 이미 모든이 설정을 가지고 있지만 – sunwukung
DB 핸들을 저장합니다 내 경우에는 MDB2) 부모 매퍼 클래스 정적, 그래서 얼마나 많은 매퍼 인스턴스를 가지고, 그들은 모두 동일한 핸들을 공유합니다. –
아, 지금은 Monostate 클래스 패턴이 맞습니까? – sunwukung