首页 > 解决方案 > 域映射 - 将模型从外部软件转换为内部结构

问题描述

我目前正在开发一个 php 框架,以抽象并使其有趣且易于使用我公司咨询的外部软件 ($ES)。我的方法是六边形设计模式,到目前为止效果很好。我唯一关心的是将实体从 $ES 映射(以及映射到哪里)到我们的内部结构。

示例:$externalSoftwareProduct(处理所有事情的神类)映射到 $internalFrameworkProduct(以及许多其他用于拆分职责的类)。这发生在存储库中。在每个存储库方法中,我从 $ES 收集这些实体并执行

new $internalFrameworkProduct(some arguments here coming from 
$externalSoftwareProduct)

foreach 我收集的实体然后返回。在这些存储库中,只有通用方法,例如 getById、getAll,您可以命名它。

现在我们在客户项目中使用这个框架,并使用特定领域的扩展来扩展这些基类,比如 CustomerNameProductRepository。在那里,您可以找到特定领域的方法,例如 getProductsCustomerAlwaysNeeds 等。在这些方法的最后,我们将 $internalFrameworkProduct 映射到 $customerSpecificProduct ,它保存数据以便于访问,这是必需的。此特定存储库中的方法如下所示。

public function getProductsCustomerAlwaysNeeds()
{
   $dataStuff = parent::getSomeStuff();
   /** @var internalFrameworkProduct[] $products **/
   $products = magic();

   foreach($products as $product)
   {
     $customerProducts[] = $this->getCustomerSpecificProduct($product->getId());
   }

   return $customerProducts;
}

public function getCustomerSpecificProductById(int $productId)
{
   $externalSoftwareProduct = new externalSoftwareProduct($productId)
   $customerSpecificProduct = new CustomerSpecificProduct(some arguments here coming from $externalSoftwareProduct)

   return $customerSpecificProduct;
}

现在到目前为止这工作正常。唯一的问题是单元测试。我们正在使用 phpunit + Mockery。为了模拟那些新创建的实例,我们必须使用 mock(overload:externalSoftwareProduct) 和 mock(overload: CustomerSpecificProduct) 这总是很痛苦(特别是如果您尝试使用多个实例进行测试,这是不时需要的) .

你会如何处理这个问题?必须有更好的方法来连接这 3 部分(externalSoftwareProduct、internalFrameworkProduct 和 CustomerSpecificProduct(它扩展了 internalFrameworkProduct))。

我正在考虑为 CustomerSpecificProduct 使用工厂,以便模拟工厂并让它吐出我的产品。但我觉得我过度设计了这样一个简单的任务。

标签: phparchitecturephpunitmockeryhexagonal-architecture

解决方案


«.... 将实体从 $ES 映射(以及映射到哪里)到我们的内部结构...»

在您用来访问外部软件的适配器中。


推荐阅读