Php OOP应用程序架构:惰性加载程序位于哪一层?
我计划为应用程序组件实现一个继承映射器模式 它需要具备的一个特性是域对象引用一个聚集项的大列表(10000个其他域对象) 因此,我需要某种延迟加载集合从聚合根域对象传递到其他域对象 为了使我的(php)模型脚本井然有序,我将它们存储在两个文件夹中: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
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以来,它就一直存在,所以语法并不容易。最后,我决定实现一个类(在域层中),并使用一个存储库迭代器来获取集合。