나는 딜레마가있다. 나는 자작 ORM을위한 핵심 구성 요소를 제공하기 위해 DI (read : factory)를 사용했습니다. 컨테이너는 요청시 데이터베이스 연결, DAO, 매퍼 및 결과 도메인 객체를 제공합니다. 여기 의존성 주입 및 작업 단위 패턴
는class Monitor(){
private static array modified;
private static array dirty;
public function markClean($class);
public function markModified($class);
}
ORM 클래스 자체 즉, 작업 패턴의 단위를 기반으로 ORM는 또한 클래스 (모니터)를 포함
class Mapper{
public function __constructor($DAO){
$this->DAO = $DAO;
}
public function load($id){
if(isset(Monitor::members[$id]){
return Monitor::members[$id];
$values = $this->DAO->selectStmt($id);
//field mapping process omitted for brevity
$Object = new Object($values);
return $Object;
}
}
class User(){
public function setName($string){
$this->name = $string;
//mark modified by means fair or foul
}
}
매퍼 및 도메인 오브젝트 클래스의 기본 개요입니다 DI 컨테이너에서 추출한 자원을 간단히 조정합니다. 새 사용자 객체를 인스턴스화하려면 다음을 수행하십시오.
$Container = new DI_Container;
$ORM = new ORM($Container);
$User = $ORM->load('user',1);
//at this point the container instantiates a mapper class
//and passes a database connection to it via the constructor
//the mapper then takes the second argument and loads the user with that id
$User->setName('Rumpelstiltskin');//at this point, User must mark itself as "modified"
내 질문에 답하십시오. 사용자가 Domain Object 클래스에 값을 설정하는 시점에서 Monitor 클래스의 클래스를 "dirty"로 표시해야합니다. 내가 볼 수있는 세 가지 옵션 중 하나가 있습니다.
1 : 모니터 클래스의 인스턴스를 도메인 개체에 전달하십시오. FirePHP에서 재귀 적으로 표시되는 것으로 나타났습니다. 즉, $ this-> Monitor-> markModified ($ this)
2 : 도메인 개체에서 모니터를 직접 인스턴스화하십시오. 3 : 모니터 메소드를 정적으로 만들고 Domain 객체 내부에서 호출합니다. 이렇게하면 DI가 손상됩니다.
행동의 당신의 추천 과정이 될 것입니다 무엇 (기존 ORM을 사용하는 것보다 다른, 나는 ... 재미를 위해이 일을하고있어) 내가 그것을 결코하지 않았다
ORM은 반환하는 객체의 참조를 유지합니까? 그렇지 않은 경우 모니터가 ORM에있는 이유는 무엇입니까? 엔티티가 자신의 모니터를 가지고 있다면, CRUD 작업을 위해 모두 ORM으로 다시 전달되면 ORM이 모니터를 변경하여 루프합니다. –
아니요, 모니터는로드 된 모든 클래스의 레코드를 유지하므로 $ User1과 $ User2는 동일한 레코드 인 경우 Monitor의 동일한 객체를 가리 킵니다. ORM 자체는 Mappers 등의 상호 작용을 처리하기위한 외관 일뿐입니다. ORM 루프 저장시 변경 사항 모니터링 – sunwukung
패턴 사용에 대해 혼란스러워합니다. DI *를 ORM에 넣으면 종속성 주입이 중단됩니다. 그렇지 않습니까? ORM은 전통적인 ORM보다는 도메인 객체를위한 팩토리입니다. 도메인 객체 팩토리에 모니터를 배치하지 않습니다.이 시나리오에서는 정적으로 만들 것입니다. 당신의 패턴이 이루고있는 것을 오해한다면, 사과드립니다. –