3

モデルレイヤーには、データマッパー、ドメインオブジェクト、および「サービス」(モデルレイヤーの外部に接続するため)があります。DomainObjectFactoryとDataMapperFactoryを実装することを選択したため、DM<->DOの関係に固執しました。理想的には、データマッパーは「get」/「read」を実行するすべてのメソッドに対して関連するドメインオブジェクトのインスタンス(またはインスタンスの配列)を返しますが、データマッパーはドメインオブジェクトファクトリにアクセスできません。

DMとDOのファクトリパターンがないと、オートローダーがDM内を引き継いで、DOのインスタンスを作成できます。しかし、これは工場でどのように達成されますか?

私が考えることができる1つの可能な解決策は、関連するドメインオブジェクトのインスタンスをデータマッパーメソッドに渡すことです。

    $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違反になります。

つまり 、データマッパーがドメインオブジェクトファクトリにアクセスして、ドメインオブジェクトを返すことができるようにするにはどうすればよいでしょうか。

4

1 に答える 1

4

私はそれを次のように解決します:

$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

マッパーは、ストレージからデータを取得するときに、ドメインオブジェクトの既存のパラメーターを条件として使用するという考え方です。ドメインオブジェクトのリストを処理している場合は、代わりにコレクションを処理するマッパーを作成し、そのコレクションに条件を割り当てます。

また、この回答があなたの問題に間接的に関連していることに気付くかもしれません。

于 2012-08-08T22:08:15.777 に答える