2

アプリケーションコンポーネントの継承マッパーパターンの実装を計画しています http://martinfowler.com/eaaCatalog/inheritanceMappers.html

必要な機能の1つは、ドメインオブジェクトが集約されたアイテムの大規模なリスト(他の10,000個のドメインオブジェクト)を参照することです。

したがって、集約ルートドメインオブジェクトから他のドメインオブジェクトに渡される、ある種の遅延読み込みコレクションが必要です。

(php)モデルスクリプトを整理するために、2つのフォルダーに保存しています。

MyComponent\
 controllers\
 models\
  domain\     <- domain objects, DDD repository, DDD factory
  daccess\    <- PoEAA data mappers, SQL queries etc
 views\

しかし今、私は自分の遅延読み込みコレクションがどこにあるのか疑問に思っています。それは両方の層をまたぐようです。内部的には一種のデータマッパーであり、外部的にはドメインオブジェクトです。

ある場所に別の場所に配置するための提案/正当化はありますか?


  • daccess=データアクセス
  • DDD =ドメイン駆動設計パターン、EricEvans-本
  • PoEAA =アプリケーションアーキテクチャパターンのパターン、MartinFowler-本
4

2 に答える 2

2

簡単な答えは、おそらくDataAccessレイヤーにあるということです。

//Domain Object
class Store {
  public function GetGiantListOfProducts() { }
}

//DataAccess Object
class LazyLoadingStore extends Store {
  public function GetGiantListOfProducts() { // function override
     // data access code
  }
}

次に、DAOは次のようになります。

class StoreProvider {
  public function GetStoreById($id) {
     //User expects a list of Store, but you actually return a list of LazyLoadingStore - nobody need know the difference
  }
}

より複雑な答えは-このリークです。本当に遅延読み込みする必要がありますか?集約ルートを再検討することをお勧めします。おそらく、$ store.GetGiantListOfProducts()メソッドはまったく必要なく、各ProductにGetStore()メソッドがあり、次のような製品のリストを取得する関係トラバーサルを変更することで、問題全体を適切に回避できます。

class ProductProvider {
  public function GetAllForStore($store) {
     // return list of products for the store
  }
}

一方、関係が最初にスケッチした方法で存在する必要がある場合、おそらく遅延読み込みは実際にはドメインにとって意味のある概念ですか?この場合、それはドメイン内に存在し、おそらく単にLazyLoaderよりも具体的で意味のある名前を持つ必要があります。

意味がありますか?

于 2010-04-06T19:03:14.007 に答える
1

データアクセス層を手書きしていますか?もしそうなら、あなたはここに概説されたテクニックを試してみたいかもしれません:

http://mynerditorium.blogspot.com/2010/01/practical-pi-lazy-loading-for-your-hand.html

私はより標準的なDAOパターンに従っていることに注意してください。ただし、遅延読み込みビットを特定のパターンに適用できると思います。

上記の手法を使用する場合、遅延読み込みコレクションをアグリゲートのDALのアグリゲートにアタッチします。ただし、コレクションはドメインレイヤーのメンバーであると考えます。

于 2010-04-01T22:12:50.083 に答える