域驱动设计 – PHP存储库模式实现问题
存储库应该从服务调用返回什么?
例如,实体(或实体集合),或者是对自身的引用,然后可以用来访问包含实体集合的属性? 拿这个示例代码: $user = $userRepository->findById(1); 要么 $users = $userRepository->findAll(); 我认为在大多数代码中,用户实体对象或用户集合实体将从这样的调用返回. 对我来说似乎有点奇怪,从一个方向来说,一个Repository会直接返回对象,但是从另一个方面来看,它会在对它们进行操作之前将它们保持在状态.以此示例代码为例: $user = $factory->make('user'); $user->setName($array_data['name']); $repo->add($user); $repo->save(); 这是怎么做的? 我认为我希望在检索方面看到更多这样的东西: $users = $userRepository->findAll(); // Returns $userRepository reference foreach($users->collection() as $user) { // Do some operations,or whatever } $users->save(); 或者,对于只读需求: $users = $userRepository->findAll(); $users = $users->collection(); // Returns User Entities held in state 澄清为什么以这种或那种方式完成它将非常感激. 工厂属于域内的哪个部门? 它应该作为Mapper对象的依赖注入吗?似乎还必须存在来自控制代码/服务层的工厂访问权限,用于创建要提交到存储库的实体. 这导致我的下一个问题…… 从控制类/服务层创建新实体的首选方法是什么? 我见过使用Factory对象,如下所示: $user = $factory->make('user'); $user->setName($array_data['name']); $repo->add($user); 以及内置的Repository方法,如下所示: $repo->saveFromArray($array_data); 在第二个示例中,$array_data将通过存储库转发到Mapper,然后Mapper将执行保存.当然,在任一示例中,都将预先检查数据源的重叠记录. 我假设第一种方法是首选?它似乎是一种更加面向对象的方法. 解决方法
你有很多问题……
始终聚合根(AR). AR设计非常重要,但它不是存储库的关注点.存储库方法根据域的需要返回一个或多个对象.没有Users Collection Enitity,有一个用户列表(在php中可能是一个数组),不要复杂化. 域存储库应仅用于域需求(读取或写入).返回整个对象,存储库不返回AR的片段,而是返回整个AR.我再次提到AR设计非常重要.
它需要的地方.我不使用工厂,最多我有一个工厂方法,但即使这是为了恢复目的(如果我使用纪念品).您不必使用工厂来创建域对象.
最简单的方法.对于大概99%的情况,您将使用“新”运算符.仅当工厂为特定实体提供具体利益时才使用工厂. Mapper从不执行保存,因为它是一个映射器.只有存储库才能执行持久性工作. Mappers将数据从一个模型转换/复制到另一个模型.您可以使用映射器将域对象映射到某些数据模型以进行持久化和返回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |