Как преобразователь данных должен возвращать объект домена?

В моем уровне модели у меня есть средства отображения данных, доменные объекты и "сервисы" (для связи вне уровня модели). Я решил реализовать 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

Идея состоит в том, что затем, извлекая данные из хранилища, маппер использует существующие параметры объекта предметной области в качестве условий. Если вы имеете дело со списком объектов домена, вы создаете маппер с работами с коллекциями и назначаете условия для этой коллекции.

Кроме того, вы можете найти этот ответ, косвенно связанный с вашей проблемой.

Другие вопросы по тегам