Я понимаю важность внедрения зависимостей и его роль в модульном тестировании, поэтому следующая проблема заставляет меня задуматься:
Одной из областей, в которой я стараюсь не использовать Singleton, является шаблон «Карта идентичности / единица работы» (который отслеживает состояние объекта домена).
//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. В то же время, избегая этого, можно было бы вызвать множество вызовов внутри объекта домена к внешним статическим методам. *
Хотя я предполагаю, что если я хочу, чтобы «сохранение» было частью его поведения, то для его создания требуется средство, позволяющее это сделать. Возможно, это проблема ответственности. Доменный объект не должен быть обременен сохранением. Это просто отличная особенность шаблона Active Record - было бы неплохо реализовать его каким-то образом.