Архитектура приложений ООП: на каком слое сидит ленивый загрузчик?

Я планирую реализацию шаблона Inheritance Mapper для компонента приложения http://martinfowler.com/eaaCatalog/inheritanceMappers.html

Одна из функций, которую он должен иметь, заключается в том, что объект домена ссылается на большой список aggreageted элементов (10 000 других объектов домена)

Поэтому мне нужна какая-то ленивая сборка для загрузки из общего объекта корневого домена в другие объекты домена.

Чтобы сохранить мои сценарии модели (php), я сохраняю их в двух папках:

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

Но теперь я ломаю голову, размышляя, где сидит моя ленивая сборная. Кажется, что оба слоя. Внутренне это своего рода картограф данных, внешне являющийся объектом домена.

Любые предложения / обоснования для размещения его в одном месте над другим?


  • daccess = доступ к данным
  • DDD = шаблоны проектирования под управлением домена, Эрик Эванс – книга
  • PoEAA = Шаблоны шаблонов архитектуры приложения, Мартин Фаулер – книга

Solutions Collecting From Web of "Архитектура приложений ООП: на каком слое сидит ленивый загрузчик?"

Простой ответ заключается в том, что он, вероятно, находится на вашем уровне 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.

Имеет смысл?

Вы вручную записываете свой уровень доступа к данным? Если это так, вы можете попробовать технику, изложенную здесь:

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

Обратите внимание, что я следую больше стандартного шаблона DAO, но я думаю, вы могли бы применить ленивые загрузочные бит к вашему конкретному шаблону.

При использовании вышеуказанной методики я прикрепляю ленивую коллекцию загрузки к совокупности в DAL агрегата. Однако я считаю коллекцию членом домена.