Как преобразователь данных должен возвращать объект домена?
В моем уровне модели у меня есть средства отображения данных, доменные объекты и "сервисы" (для связи вне уровня модели). Я решил реализовать DomainObjectFactory и DataMapperFactory, что оставило меня в тупике отношений DM<->DO. В идеале преобразователь данных должен возвращать экземпляр (или массив экземпляров) связанного объекта домена для каждого метода, который выполняет "get"/"чтение", но преобразователь данных не имеет доступа к фабрике объектов домена.
Без заводского шаблона для DM и DO автозагрузчик может вступать во владение внутри DM, так что могут создаваться экземпляры DO. Но как это сделать с фабрикой?
Одним из возможных решений, которое я могу придумать, было бы передать экземпляр связанного объекта домена в метод отображения данных, например:
$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');
//Pass an [empty] user DO to the DM, which will be returned back
$mapper->getById($someIDValue, $user);
Эта опция кажется очень грязной, но она будет работать для отдельных методов get. Однако это семантически выходит из-под контроля при возврате массива доменных объектов, поэтому очевидно, что это не лучший способ сделать это... Другой вариант - разрешить доступ преобразователя данных к фабрике объектов домена, но это превратится в серьезное нарушение LOD/SRP.
Вкратце: как преобразователь данных может получить доступ к фабрике объектов домена, чтобы иметь возможность возвращать объекты домена?
1 ответ
Я решаю это так:
$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');
$user->setName('Foobar');
$mapper->fetch( $user );
// mapper acquires entries that are related to user with name `"Foobar"`
// and loads it into the domain object
Идея состоит в том, что затем, извлекая данные из хранилища, маппер использует существующие параметры объекта предметной области в качестве условий. Если вы имеете дело со списком объектов домена, вы создаете маппер с работами с коллекциями и назначаете условия для этой коллекции.
Кроме того, вы можете найти этот ответ, косвенно связанный с вашей проблемой.