контроллер представления модели — где должна лежать единица работы в приложении MVC?

В моем файле index.php у меня есть это:

$service_factory = new ServiceFactory(new MapperFactory($db), new DomainFactory);

Мое понимание того, как UnitOfWork должен работать с моим приложением, таково (состояние относится к грязному, чистому и т. Д.):

  • Mapper — отмечает состояние объекта
    • Или $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.

Может быть, я чего-то упускаю, но любые предложения или полезные идеи очень ценятся!

2

Решение

Элемент управления «Работа» обычно помещается в Службу приложений в DDD, поэтому, я думаю, это означает вариант № 2.

Обратите внимание, что весь ваш вопрос может быть из-за слишком сложного дизайна.

  • Очень много Factories как правило, запах кода — особенно DomainFactory один 🙂 Есть ли конкретная причина использовать их?

  • Создание (объектно-реляционного, я полагаю) экземпляра маппера путем передачи ему предметного объекта кажется надуманным. Кроме того, не очевидно, что MapperFactory около. Это создает картографы? Является ли карта и создать ?

  • Вы пытаетесь реализовать свою собственную единицу работы с нуля? Может быть, изобретать велосипед заново, большинство фреймворков ORM имеют эту встроенную функциональность. Хотя я не знаю о PHP.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]