当前位置: 首页 > 知识库问答 >
问题:

域模型协会延迟加载

仰欣悦
2023-03-14

我目前面临的问题是如何处理聚合中实体之间的关联。

考虑以下示例:

现在,我们有一个,User“实体,也是我的聚合根。他可以有一个,Product”和多个,别名。我现在需要的是检索相关的,Product和,,域模型中的“按需别名”。用户由UserFactory创建,当从持久性数据创建实体时,可以单独使用,也可以在UserRepository中使用。

<?php
class User {
   private $id;

   private $aliases;
   private $product;

   public function isEligibleForCompanyPromotion() {
      //I need a good way to populate this without a performance bottleneck. 
      $product = $this->product;
      [.. code comparing things between User and Product begins ..]
   }     

}

这样做的原因是因为我们的业务逻辑(如您在示例中看到的)在很大程度上依赖于对象之间的关联,我认为与对象之间的关联相关的逻辑应该在域模型中完成(或者可能应该移出?)

我考虑了以下解决方案:

1) 在构建用户时,只需加载所有内容(关联的产品和别名)。

赞成的意见:

  • 作品?

欺骗:

  • 很大的性能问题(不幸的是,我正在开发实时高负载系统,因此不能错过)

2)将关系存储库注入域模型

  private $productRepository;
  private $aliasesRepository;
  [...]

}

赞成的意见:

  • 工作

欺骗:

  • 违反了DDD的目的(imo),用户被要求在其中拥有存储库(因此域模型与持久性相耦合)

3) 将关联相关逻辑委托给域外模型(可能是域服务和策略?)

赞成的意见:

  • 也有效

欺骗:

  • 实际上,我觉得这导致了领域模型的匮乏,因为我们的大多数业务逻辑都是基于对象之间的关系,所以很多代码都会被移出领域对象,这是毫无意义的

4) 创建用于处理关系的专用关系对象:

<?php
class UserFactory { 

private $relationshipFactory;

public function createUser($persistenceData) {
    $user = new User();
    [.. creating of User, populating data etc .. ]
    $user->product = $this->relationshipFactory->createUserProductRelationship($user);
}

}


class UserProductRelationship {

    private $user;
    private $product;
    private $productRepository;

    [.. productRepository is being injected within relationshipFactory, and user is  provided ..]

    public function loadProduct() { 
      [.. load the product based on the relationship criterias ..]
    }

    [.. calls to this object are proxied to lazy-loaded product via __call, __get etc. )
}

赞成的意见:

  • 也有效

欺骗:

  • 循环依赖(用户需要在内部拥有UserProduct关系并依赖它。需要为UserProduct关系提供User实体。组合这两个类将导致场景#2)。

也许我没有完全理解。。如果有人有什么建议,我很高兴听到。

谢谢

共有1个答案

陈坚
2023-03-14

如果某些责任不属于任何对象或域对象需要太多不相关的数据来解决问题,则引入规范对象。

您需要的是一个EligibleForCompany促销规范,例如:

class EligibleForCompanyPromotion {
    private $productRepository;
    private $aliasesRepository;

    public function isSatisfiedBy(User user) {
       //I need a good way to populate this without a performance bottleneck. 
       $product = $productRepository.find(user.productId);
       [.. code comparing things between User and Product begins ..]
}   

class User {
   private $id;

   private $aliasesId;//only identifiers needed
   private $productId;//only identifiers needed 

在这种情况下,域逻辑不会泄漏到应用层,我们也不必将存储库注入用户。

 类似资料:
  • 主要内容:实例,实例,实例,实例关键词: 分布延迟, 集总延迟, 路径延迟 之前大部分仿真都是验证数字电路功能的正确性,信号传输都是理想的,没有延迟。但是实际逻辑元器件和它们之间的传输路径都会存在延迟。因此,必须检查设计中的延迟是否满足实际电路的时序约束要求。可以用时序仿真的方法来检查时序(timing),即在仿真时向元件或路径中加入和实际相符的延迟信息,并进行相关计算来确定时序是否满足。 静态时序分析 (Static Timi

  • 为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component

  • 问题内容: 我有一个像这样的领域类: 并且我想启用延迟加载到“内容”列的方法,因为应用程序无需访问此列即可执行某些操作。 但是lazy:true选项不起作用…任何想法或解决方法? 问题答案: 您所说的应用程序是什么意思?您想建立什么? 仅供参考。渴望和延迟加载通常与关系有关,默认情况下,grails启用了延迟加载。例如” 在您的代码中没有关系。content是Document的属性,因此延迟加载在

  • 使用这个延迟加载代码,我的lightbox中断:单击一个图像显示lightbox,但没有图像。 通过检查inspector,我可以看到lightbox img标签没有值。我猜在延迟加载将属性和值分配给图像之前,lightbox会检查src。 如何解决此问题?

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 至于CSS字体权重选项,我正在尝试ubuntu字体。 链接到href='http://fonts.googleapis.com/css?family=Ubuntu:500,300,700,400斜体,400' 所有主体字体权重是400(正常),但标题是h2和字体权重=300所有内容加载迅速,但标题,它有一个小延迟我不喜欢。我不确定它是如何工作的,我猜ubuntu-400在FF字体列表中,但它必须从