Entendo que a maneira preferida de trabalhar entre os módulos no Magento 2 é usando os contratos de serviço.
Portanto, se eu quiser carregar um produto, eu uso o repositório do produto:
$product = $productRepository->getById($id);
que é por contrato retornando uma instância de Magento\Catalog\Api\Data\ProductInterface
.
Mas eu também poderia usar a maneira antiga, chamando a camada de domínio diretamente:
$product = $productFactory->create()->load($id);
Existe algum caso em que isso seria necessário ou útil?
Os devdocs dizem (destaque adicionado):
Um módulo pode chamar diretamente em outro módulo. Essa solução fortemente acoplada não é recomendada para a maioria das situações, mas às vezes é inevitável .
[...]
Sua estratégia para chamar o código da camada de domínio de outro módulo depende muito da configuração e necessidades exclusivas do seu sistema.
Fonte: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
E um comentário sobre uma pergunta relacionada afirmou:
usar o Repositório fornecerá um modelo de dados do Produto (
Api/Data/Product
), que é um modelo do Produto convertido em um DTO simplificado. Algo a considerar, pois são bem diferentes
Mas, tanto quanto posso ver, os objetos são os mesmos em condições normais, apenas os tipos de retorno por phpDoc diferem ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)