首先,我是DDD的新手,所以我可能会弄错一些概念。
我所面临的问题如下:
我有一个处理系统的工单清单。票证基于爬虫系统抓取/跟踪的来自外部源的数据。
显然,这两个是独立的有界上下文。至于现在,我非常确定,我的边界在这里是正确的,因为它们几乎没有共同点(ticket连接到外部源,但它们是单独处理和更新的,并且以不同的方式)。
现在,我想创建一个包含所有票证的票证列表。每个票据都有来自一个有界上下文(可用操作等)的一些数据和来自另一个上下文(外部数据的图形表示)的一些数据。
我已经知道,为了避免数据重复,我可能会使用每个票据的复合视图,其中每个有界上下文呈现自己的UI部分。我见过亚马逊网站的分解。我们还假设,我的模板框架允许我使用块或组件来组成票证视图。
问题所在
我正在努力寻找一种方法来在应用程序中检索这些视图/ UI部件,而不需要太多的查询。我不想为每个组件发出一个请求,以避免N+1查询地狱(即使这些查询位于某个NoSQL缓存中)。我想象一下,我的视图控制器以某种方式请求两个绑定上下文提供控件列表,然后呈现它们(例如,一个根据搜索条件检索票据列表,另一个基于外部内容ID列表检索外部内容)。但我不确定我是否在正确的轨道上。
任何语言(伪语言)的代码示例都是非常受欢迎的。
发布于 2015-01-22 05:41:16
我认为你在正确的轨道上。
正如您所写的,您可以使用服务创建某种视图模型(视图实体),该服务只查询一次一个源和第二个(外部)源。然后,它将它们合并到单视图模型中,该模型将传递到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);https://stackoverflow.com/questions/28069372
复制相似问题