В моем файле index.php у меня есть это:
$service_factory = new ServiceFactory(new MapperFactory($db), new DomainFactory);
Мое понимание того, как UnitOfWork должен работать с моим приложением, таково (состояние относится к грязному, чистому и т. Д.):
$user->markNew();
или же $uow->registerNew($user);
$this->isDirty();
commit()
вызывается для завершения транзакций
$this->uow->commit()
или же $mapper->commit()
Моя функция коммита моего UnitOfWork выглядит следующим образом (не стесняйтесь улучшать):
public function commit()
{
// Inserts the new objects
foreach ($this->newObjects as $newObject) {
$mapper = $this->mapperFactory->createFromDomainObject($newObject);
$mapper->insert($newObject);
}
// Update the dirty objects
foreach ($this->dirtyObjects as $updateObject) {
$mapper = $this->mapperFactory->createFromDomainObject($updateObject);
$mapper->update($updateObject);
}
// Delete the removed
foreach ($this->deletedObjects as $deletedObject) {
$mapper = $this->mapperFactory->createFromDomainObject($deletedObject);
$mapper->delete($deletedObject);
}
}
профессионалЕсли у меня одна служба, вызывающая другую, мне не придется беспокоиться о том, чтобы не передавать объекты Domain между собой, поскольку они будут использовать один и тот же экземпляр UnitOfWork.
Против: Я должен был бы передать объект UnitOfWork до объекта mapper, который будет иметь много уровней: ServiceFactory -> Service -> MapperFactory -> Mapper … Ew. Это не устраивает меня.
Кроме того, поскольку UnitOfWork требует MapperFactory, мой index.php изменится на это:
$uow = new UnitOfWork(new MapperFactory($db));
$mapper_factory = new MapperFactory($db, $uow);
$service_factory = new ServiceFactory($mapper_factory, new DomainFactory, $uow);
Как вы можете видеть, это похоже на связку UnitOfWorks и MapperFactories повсюду, просто не красиво.
профессионалУ меня не было бы уродливого файла index.php. Я бы просто создал новый экземпляр UnitOfWork для каждого объекта службы. Внутри моей ServiceFactory будет выглядеть так:
/**
* Create method
*
* This will create a new Service class if it hasn't
* already been instantiated, and return it.
*
* @param string $name The class name
* @return mixed
*/
public function create($name)
{
$class = '\\MyApp\\Service\\' . $name;
if ( array_key_exists($class, $this->cache) === false) {
if (class_exists($class)) {
$uow = new UnitOfWork($this->mapperFactory);
$this->cache[$class] = new $class(
$this->mapperFactory,
$this->domainFactory,
$uow
);
} else {
throw new Exception(sprintf('Service class %s does not exist.', $class));
}
}
return $this->cache[$class];
}
Это кажется мне чище.
ПротивЯ бы не смог заставить службы звонить друг другу. Тем не менее, я нахожусь на начальных этапах этого проекта, и это моя первая попытка несколько «правильного» MVC-приложения, поэтому я не уверен, будут ли у меня службы, вызывающие друг друга много или нет.
профессионалНе совсем то, что я вижу, но это все же вариант. В моем index.php я мог бы иметь это:
$uow = new UnitOfWork($db);
$service_factory = new ServiceFactory(new MapperFactory($db,$uow), new DomainFactory);
Мой класс UnitOfWork может расширять класс MapperFactory, и поэтому нет необходимости создавать два экземпляра MapperFactory. Я бы передавал один и тот же экземпляр UnitOfWork каждому мапперу.
ПротивЯ должен был бы зафиксировать транзакции в моем классе Service, выполнив что-то вроде этого:
$this->mapperFactory->unitOfWork->commit();
Слишком много вызовов функций на мой вкус. Кроме того, я не уверен, как я позволил бы объектам домена проверять их состояние без ссылки на объект UnitOfWork.
Элемент управления «Работа» обычно помещается в Службу приложений в DDD, поэтому, я думаю, это означает вариант № 2.
Обратите внимание, что весь ваш вопрос может быть из-за слишком сложного дизайна.
Очень много Factories
как правило, запах кода — особенно DomainFactory
один 🙂 Есть ли конкретная причина использовать их?
Создание (объектно-реляционного, я полагаю) экземпляра маппера путем передачи ему предметного объекта кажется надуманным. Кроме того, не очевидно, что MapperFactory
около. Это создает картографы? Является ли карта и создать ?
Вы пытаетесь реализовать свою собственную единицу работы с нуля? Может быть, изобретать велосипед заново, большинство фреймворков ORM имеют эту встроенную функциональность. Хотя я не знаю о PHP.
Других решений пока нет …