【发布时间】:2015-03-30 11:59:19
【问题描述】:
具有以下结构:
-
演示级别:
Web 界面、REST API 和命令提示符 - 都只调用 OrderService。
-
应用层:
class OrderService { private $em; private $repository; private $calculator; public function __construct( \Doctrine\ORM\EntityManagerInterface $em; ClientRepositoryInterface $repository, cumulativeDiscountCalculator $calculator } { $this->em = $em; $this->repository = $repository; $this->calculator = $calculator; } public function calculateCumulativeDiscount($id) { $this->em->beginTransaction(); try { $client = $this->repository->findClient(); $this->calculator->calculate($client); $this->em->flush(); $this->em->commit(); } catch (\Exception $e) { $this->em->rollback(); throw $e; } } } -
模型层:
interface ClientInterface { public function setDiscount($discount); } interface ClientRepositoryInterface { public function findClient($id); public function findClientsByDataRange($from, $to); } class cumulativeDiscountCalculator { public function calculate(ClientInterface $client) { $client->setDiscount(mt_rand(1, 50)); } } -
基础设施层:
PHP Doctrine 2 - 实现 ClientRepositoryInterface。
我的任务 - 为一组客户执行计算折扣。 (ClientRepositoryInterface::findClientsByDataRange方法返回集合进行处理)
问题是我需要处理多达 100,000 条记录。我知道如何在技术上做到这一点,但如何在 DDD 方面做到这一点?出现以下问题:
- 批处理使用哪个层?
- 如何收集操作的结果:错误、成功客户端计数等?
- 在哪里设置事务边界(每 N 个客户端 - 提交并开始一个新事务)?
- 我有大约 10-20 个批处理操作,开发任何结构可能有意义吗?
【问题讨论】:
-
您必须向我们提供有关域操作本身的更多信息。有没有不变量?什么是用来计算折扣的?为什么所有这些折扣必须一起计算?仅仅是为了方便吗?什么会触发折扣?
-
每月(第一天)计算一次折扣。折扣的计算有很多规则。我有许多类似的(批量)操作,例如:删除特定制造商的所有产品、更改所有价格等。它们是否正确执行?对一般情况感兴趣。
标签: php doctrine-orm domain-driven-design batch-processing