Ben Dependency Injection önemini ve neden aşağıdaki sorun beni duraksatıyordur Unit test, rolünü anlamak:
Ben Singleton kullanmak için değil mücadele Bir alan Çalışma desen Kimlik Haritası / Birimi (Domain Object durumuna sekmeleri tutar Hangi) 'dir.
//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);
Bu durumun üstesinden nasıl herhangi bir tavsiye?
DI karşılamak için kendini Nesne Etki içine mapper / veritabanı erişimi örneklerini oluşturmak / geçmek nefret olurdu - kaçınarak, aynı zamanda, dış statik yöntemlere Domain Nesne içindeki çağrı sürü sonuçları.
Ben onun davranışının bir parçası olmak için "kaydet" istiyorsanız, o bunu yapmak için bir tesis inşaat gereklidir sanırım rağmen. Belki de sorumluluk ile ilgili bir sorun var, Domain Nesne tasarrufu ile yük olmamalıdır. Bu sadece Active Record desen oldukça düzgün bir özellik değil - bir şekilde uygulamak güzel olurdu.