di.xml 中接口的作用与 <type> 的区别

Difference between role of Interfaces and <type> in di.xml

我对 di.xml 中使用的接口 <preference><type> 属性的作用有一个疑问。在什么情况下我们应该使用 <preference><type> ?在逻辑实现方面是否存在任何实质性差异。

例如转到 app/code/Magento/Catalog/etc/di.xml,会有很多使用 <preference><type> 标签的实例。我们究竟如何区分它们?

期待听到想法。

<preference>习惯于indicate which concrete class you want the DI framework to supply when that type is requested

<type> 用于几个不同的事情,其中​​之一是提供或覆盖注入到具体类型的构造函数中的参数。 <type> 声明也是 used to declare plugins

您在 <preference><type> 中看到一个接口的时间是为该接口定义插件的时间。 <type> 允许您在该对象类型上声明一个插件,无论它是具体的 class 还是接口。

示例来自 app/code/Magento/Catalog/etc/di.xml

<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
...
<type name="Magento\Catalog\Api\ProductRepositoryInterface">
    <plugin name="transactionWrapper" type="\Magento\Catalog\Model\Plugin\ProductRepository\TransactionWrapper" sortOrder="-1"/>
</type>