ドメインモデルをアプリケーションのさまざまな部分で再利用する方法を理解しようとしていますが、データマッパーパターンが進歩していると感じています。以下の例には、Mapperのメソッドに直接アクセスするメソッドがあります。複数のデータマッパーを必要とするドメインオブジェクト
class Groups
{
protected $_groups = array();
public function addGroup($name)
{
$this->_groups[] = $name;
}
public function doSomethingGroupy($cakes)
{
// get all the groups that have cake
return $cakeyGroups;
}
}
...そして、グループクラスのメソッドと一致するマッパー。
class GroupMapper
{
public function find($id, Groups $group)
{
// Mappy type things, maybe some sql
}
public function fetchByNeediness($cuddles, Groups $group)
{
// More mappy type things
}
public function save(Groups $groups)
{
// Saves
}
}
しかし、いつか後、私は、同じグループのモデルを使用しますが、私は別のマッパーを使用する別のクエリを使用してグループを移入したい場合。今
class AngryGroupMapper
{
public function find($id, Groups $group)
{
// Something similar but with other tables and joins
}
public function fetchByRage($anger, Groups $group)
{
// Something new but only needed here
}
public function isEditable(Groups $groups)
{
// Do some querying
return $bool;
{
}
私は目的がスキニーコントローラである知っている - 脂肪モデル、ので、私はモデルに(いわば)マッパーをマッピングするために別のモデルを持っているでしょうか?
class FatModelRepository
{
public function getHappyGroups()
{
$mapper = new GroupMapper();
return $mapper->fetchByNeediness('Puffy Shoes', new Groups());
}
public function getSadGroups()
{
$mapper = new AngryGroupMapper();
return $mapper->fetchByRage('Aghh!', new Groups());
{
public function save(Groups $groups)
{
$mapper = new GroupMapper();
return $mapper->save($groups);
{
}
「グループ」が「グループ」オブジェクトを含むコレクションであり、モデル自体が依存マッピングを必要とする場合はどうなりますか。あなたはグループからそれらを切り離し、Mapperを通してそれらを渡してから、それらをコレクションに再接続する必要がありますか?それはクライアント/コントローラがマッパーの知識を必要とするのだろうか? – gawpertron
あなたの 'FatModel'はリポジトリと呼ばれます。ここでその良い説明があります:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca
なぜでしょうか?お客様のニーズに合わせて設計してください。私はキャッシュとしてレポを使用しません。キャッシュをデータマッパーに置きます。 – rojoca