首先,我是DDD的新手,所以我可能会错误地提出一些概念。
我面临的问题如下:
我有一些处理系统的门票清单。票证基于Crawlin System抓取/跟踪的外部来源的数据。
显然,这两个是独立的有界上下文。至于现在我很确定,我的边界在这里是正确的,因为它们几乎没有共同点(票证连接到外部源,但它们是以不同方式单独处理和更新的)。
现在,我想创建一张包含所有门票的门票列表。每张票都有一些来自一个有界上下文(可用操作等)的数据和一些来自另一个(外部数据的图形表示)的数据。
我已经知道,为避免数据重复,我可能会使用每个故障单的复合视图,其中每个有界上下文都会呈现自己的UI部分。我看过亚马逊网站的分解。我们还假设,我的模板框架允许我使用块或组件来组成故障单视图。
我正在努力学习一种在应用程序中检索这些视图/ UI部件而不需要太多查询的方法。我不想为每个组件发出一个请求以避免N + 1查询地狱(即使这些查询在某些NoSQL缓存上)。我想,我的视图控制器以某种方式要求有界上下文提供控件列表然后呈现它们(例如,一个基于搜索条件检索票证列表,另一个基于外部内容ID列表检索外部内容) 。但我不确定自己是否走上正轨。
非常感谢任何语言(伪语言)的代码示例。
答案 0 :(得分:0)
我认为你走在正确的轨道上。
正如您所写的那样,您可以为此创建某种视图模型(视图实体),其服务只能查询一个源和第二个(外部)源。然后它会将它们合并到单个视图模型中,这些模型将被传递到UI层。
这样,您还可以在域层中保持数据合并的逻辑。在表示层中,您可以像普通视图模型(实体)一样使用它们 - 不会泄漏信息源,如何合并它们等等。
进入域图层后,您也可以添加本地缓存(如果需要)。
<?php
class ViewTicketProvider
{
private $externalService;
public function __construct(ExternalProviderInterface $externalService)
{
$this->externalService = $externalService;
}
public function getViewTickets(Collection $tickets)
{
$ids = $tickets->getIds();
$externalEntities = $this->externalService->getByIds($ids);
$viewTickets = array();
foreach ($tickets as $ticket) {
$viewTicket = new ViewTicket($ticket);
// If this is too complex, use another service for the merging.
$viewTicket->addMoreInfoFromExternalSource($externalEntities);
$viewTickets[] = $viewTicket;
}
return $viewTickets;
}
}
$ticketRepo = new TicketRepository();
$externalService = new ExternalService();
$tickets = $ticketRepo->getTicketsBasedOnSomeCriteria($criteria);
$viewTicketProvider = new ViewTicketProvider($externalService);
$viewTickets = $viewTicketProvider->getViewTickets($tickets);