Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php OOP应用程序架构:惰性加载程序位于哪一层?_Php_Domain Driven Design_Lazy Loading_Poeaa - Fatal编程技术网

Php OOP应用程序架构:惰性加载程序位于哪一层?

Php OOP应用程序架构:惰性加载程序位于哪一层?,php,domain-driven-design,lazy-loading,poeaa,Php,Domain Driven Design,Lazy Loading,Poeaa,我计划为应用程序组件实现一个继承映射器模式 它需要具备的一个特性是域对象引用一个聚集项的大列表(10000个其他域对象) 因此,我需要某种延迟加载集合从聚合根域对象传递到其他域对象 为了使我的(php)模型脚本井然有序,我将它们存储在两个文件夹中: MyComponent\ controllers\ models\ domain\ <- domain objects, DDD repository, DDD factory daccess\ <- PoEA

我计划为应用程序组件实现一个继承映射器模式

它需要具备的一个特性是域对象引用一个聚集项的大列表(10000个其他域对象)

因此,我需要某种延迟加载集合从聚合根域对象传递到其他域对象

为了使我的(php)模型脚本井然有序,我将它们存储在两个文件夹中:

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

域\您是否手工编写数据访问层?如果是这样的话,您可能需要尝试下面概述的技术:

请注意,我遵循的是更多的标准DAO模式,但我认为您可以将延迟加载位应用于您的特定模式


使用上述技术时,我将延迟加载集合附加到聚合的DAL中的聚合。但是,我认为集合是域层的成员。

简单的答案是它可能位于您的数据访问层。

//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更具体、更有意义的名称


有道理吗?

谢谢你。是的,为了一个遗留的烂摊子我自己滚。关注了你的链接后,我现在左右为难:*和*你左右为难,分别在4岁和10岁的帖子中给出建议?Oy VyyEp,我会考虑4, 10岁甚至一千岁的建议(虽然我不是特别虔诚的教徒,也不会把它当作是一种教条而不去检查其他的选择)。在第一个示例中,有一件事是LazyLoadingStore扩展存储?可能是打字错误。不确定。经过深思熟虑,我认为你在回答的第二部分是正确的,因为这是一个更“领域”而不是“数据访问”的东西。是的,这是一个打字错误。抢手货我修好了。自从我编程php以来,它就一直存在,所以语法并不容易。最后,我决定实现一个类(在域层中),并使用一个
存储库迭代器来获取集合。