域映射 - 将模型从外部软件转换为内部结构

Domain Mapping - Convert Models from external Software to internal structure

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

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

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

foreach 我收集的实体然后被返回。在这些存储库中,只有通用方法,如 getById、getAll,随便你怎么说。

现在我们在客户项目中使用此框架,并使用领域特定的扩展扩展那些基础 classes,例如 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 使用工厂,以便模拟工厂并让它吐出我的产品。但我觉得我过度设计了这样一个简单的任务。

«.... 将 $ES 中的实体映射(以及映射位置)到我们的内部结构...»

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