【问题标题】:A list of objects with data from multiple bounded contexts包含来自多个有界上下文的数据的对象列表
【发布时间】:2015-01-21 14:15:58
【问题描述】:

首先,我是 DDD 的新手,所以我可能会弄错一些概念。

我面临的问题如下:

我有一些处理系统的工单清单。门票基于 Crawlin System 抓取/跟踪的外部来源数据。

显然,这两个是独立的限界上下文。至于现在,我很确定,我的边界在这里是正确的,因为它们几乎没有共同点(票证连接到外部源,但它们分别以不同的方式处理和更新)。

现在,我想创建一个包含所有门票的门票列表。每张工单都有一些来自一个有界上下文(可用操作等)的数据和一些来自另一个(外部数据的图形表示)的数据。

我已经知道,为了避免数据重复,我可以使用每个工单的复合视图,其中每个有界上下文呈现其自己的 UI 部分。我见过亚马逊网站分解。我们还假设,我的模板框架允许我使用块或组件来组成工单视图。

问题

我正在努力寻找一种无需太多查询即可在应用程序中检索这些视图/UI 部分的方法。我不想为每个组件发出一个请求以避免 N+1 查询地狱(即使这些查询在某些 NoSQL 缓存上)。我想,我的视图控制器以某种方式要求两个有界上下文提供控件列表,然后呈现它们(例如,一个基于搜索条件检索票证列表,另一个基于外部内容 ID 列表检索外部内容) .但我不确定我是否走在正确的轨道上。

非常感谢任何语言(伪语言)的代码示例。

【问题讨论】:

    标签: php domain-driven-design composition


    【解决方案1】:

    我认为你在正确的轨道上。

    正如您所写的那样,您可以为此创建某种视图模型(视图实体),该服务将只查询一个源和第二个(外部)源一次。然后它将它们合并为单个视图模型,这些模型将传递到 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);
    

    【讨论】:

    • 不错。给我一些时间,直到我接受这个,我必须进行测试:)
    • 你的测试怎么样? :) 有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2017-02-11
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多