Простой ответ заключается в том, что он, вероятно, находится на вашем уровне 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 (), и он может изящно обойти всю проблему, изменив обход отношений, где у каждого продукта есть метод GetStore (), и вы получите список продуктов, например:
class ProductProvider {
public function GetAllForStore($store) {
// return list of products for the store
}
}
С другой стороны, если отношения должны существовать так, как вы их изначально набросали, то, возможно, ленивая загрузка на самом деле является концепцией, которая имеет смысл для области? В этом случае он находится в домене и, вероятно, должен иметь более конкретное и значимое имя, чем просто LazyLoader.
Имеет смысл?