域映射 - 将模型从外部软件转换为内部结构
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 中的实体映射(以及映射位置)到我们的内部结构...»
在您用来访问外部软件的适配器中。
我目前正在开发一个 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 中的实体映射(以及映射位置)到我们的内部结构...»
在您用来访问外部软件的适配器中。